【Android】 Espresso 與 RecylerView

上篇文章有說到如果是AdapterView的話可以使用onData,可惜的是RecylerView並不屬於AdapterView,是屬於ViewGroup

因此,並不適用onData。那怎麼辦呢?
別擔心,Google很貼心的提供RecyclerViewActions,本篇將介紹如何使用

首先先設定你的bulid.gradle

不過通常你的dependencies裡面已經包括了recylerview 與 supoort library,有可能會造成衝突。這樣的情況下,可以這樣設定:

接著就可以開始使用 RecyclerViewActions
以下的是點擊recylerview裡指定的位置,寫法如下(以位置2為例):

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

可用hasDescendant指定recylerview裡的item,寫法如下:

onView(withId(R.id.recyclerView))
.perform(RecyclerViewActions.actionOnItem(
hasDescendant(withText(“”Hello”)), click()));

不過如果要check recyclerview裡的每個item(像是check某個item是否顯示相對應的string),RecyclerViewActions並沒有相對應的method。這時候該怎麼辦呢?就要自己寫改寫 Matcher了。
google了許多方法,終於找到github上dannyro的Android Espresso Samples
而在dannyro的project裡,最重要的為以下的兩個class
第一個就是改寫 Matcher的 class,這邊要注意 atPositionOnView 這個method裡面做的事。

接下來是 TestUtils class,注意 withRecyclerView 這邊,會直接new RecyclerViewMatcher(recyclerViewId),而actionOnItemViewAtPosition是指定recyclerView裡面item的click事件。


最後同場加映測試ActionBarMenu的方法

openActionBarOverflowOrOptionsMenu(getInstrumentation().getTargetContext());
onView(withText(R.string.menu_settings)).perform(click());


心得

雖然Espresoo寫法簡單,不過必須清楚了解整個 View Hierarchy,且對於客製化View的Test較沒有考慮到。

參考資料
Android Espresso Samples
Like what you read? Give HsiangYu Chen(Shine) a round of applause.

From a quick cheer to a standing ovation, clap to show how much you enjoyed this story.