Android、Java、Web系、Linux、マラソン等の備忘録

2016/05/17

EspressoでのRecyclerViewのテスト

0 件のコメント

RecyclerViewもAdapterを扱うのでListViewの時のようにonDataを使うのかと思ったら違うようなのでメモしておきます。ここでは、RecyclerViewでテキストのリストを表示するようなプロダクトコードのテストを想定しています。

環境

  • Android Studio 2.1.1
  • compileSdkVersion 23
その他build.gradleで扱ってるライブラリのバージョン等は下記に記載しています。

テキストが表示されてるか確認

RecyclerView上の任意のTextViewに表示されている文字列を確認するコードです。RecyclerViewではonViewを扱います。

onView(withId(R.id.recyclerView))
        .check(matches(hasDescendant(withText("hogehoge"))));

指定行をクリック

positionが1の行(ViewHolder)をクリックするコードです。

onView(withId(R.id.recyclerView)).perform(
            RecyclerViewActions.actionOnItemAtPosition(1, click()));

このRecyclerViewActionsを扱うにはbuild.gradleのespresso-coreの代わりにespresso-contribを記述してやる必要があるのですが、依存関係でエラーが出て難儀しました。うまくいったdependenciesは以下の通り(余計なものも含まれてます)


指定行の子Viewをクリック

上記を応用します。click()の部分をカスタムViewActionに置き換えます。


テストはこんな感じで

onView(withId(R.id.recyclerView)).perform(
        RecyclerViewActions.actionOnItemAtPosition(1,
                MyViewAction.clickChildViewWithId(R.id.imageButton)));

position1番目に入ってるImageViewをクリックしています。

ちなみに、RecyclerView.AdapterでviewTypeを切り替えてHeader等入れる実装をしていると、position 0にHeaderが入ってるの忘れがちです。

リストの並びを確認する場合

RecyclerViewのどのpositionにどのデータが入ってるか確認したい場合です。こちらがとても参考になります。

こちらを補足するとテストではこんな感じ記述します。


viewTypeを切り替えてHeaderを扱うようなAdapterでItemのデータと関係ない独立したHeaderを設置するような実装だと注意が必要です。

RecyclerViewInteractionクラス内のfor文ではitemsのサイズで回しているの対して、RecyclerItemViewAssertionではViewHolderのpositionを参照しているからです。もっと綺麗なやり方あると思いますが、とりあえず思いついた少ない記述での修正だとこんな感じでしょうか。


RecyclerViewInteractionにstartPositionというパラメータを増やしてます。これに1を指定することでRecyclerViewのViewHolderは1番目からチェックされます。

参考

0 件のコメント :

コメントを投稿