[英]Android:Espresso: How get item on specific position of RecyclerView?
[英]How to use Espresso to test item in adapter at a specific position
我正在嘗試使用Espresso(2.0)來驗證列表適配器項中給定位置的文本是否正確,並且在我的生命中我無法找出正確的調用方法。
我的適配器類型( IconRowAdapter
)包含一個IconRow
對象的列表。 每個IconRow都有一個getText()
方法,該方法返回該項目的文本。
這是非Espresso工作測試代碼,用於驗證適配器中位置0的IconRow對象是否具有預期的文本(“藝術家”)。
public void testHomeActivityMenu() {
ListView list = (ListView) getActivity().findViewById(R.id.item_list);
IconRowAdapter adapter = (IconRowAdapter) list.getAdapter();
assertEquals(adapter.getItem(0).getText(), "Artists");
}
這可行。
我已經嘗試了以下Espresso代碼的各種版本來做同樣的事情,
onData(is(instanceOf(IconRowAdapter.class)))
.atPosition(0)
.check(matches(withItemContent("Artists")));
其中withItemContent()
看起來像這樣:
public static Matcher<Object> withItemContent(String expectedText) {
checkNotNull(expectedText);
return withItemContent(equalTo(expectedText));
}
@SuppressWarnings("rawtypes")
public static Matcher<Object> withItemContent(final Matcher<String> itemTextMatcher) {
checkNotNull(itemTextMatcher);
return new BoundedMatcher<Object, IconRow>(IconRow.class) {
@Override
public boolean matchesSafely(IconRow iconRow) {
return itemTextMatcher.matches(iconRow.getText());
}
@Override
public void describeTo(Description description) {
description.appendText("with item content: ");
itemTextMatcher.describeTo(description);
}
};
}
我希望這樣做是:
運行該命令時,出現以下錯誤:
Caused by: java.lang.RuntimeException: No data found matching: is an instance of
uk.org.ngo.squeezer.IconRowAdapter contained values: <[Data:
uk.org.ngo.squeezer.IconRowAdapter$IconRow@b1585980 (class:
uk.org.ngo.squeezer.IconRowAdapter$IconRow) token: 0, Data:
uk.org.ngo.squeezer.IconRowAdapter$IconRow@b15859e0 (class:
uk.org.ngo.squeezer.IconRowAdapter$IconRow) token: 1, Data:
uk.org.ngo.squeezer.IconRowAdapter$IconRow@b1585a00 (class:
uk.org.ngo.squeezer.IconRowAdapter$IconRow) token: 2, Data:
uk.org.ngo.squeezer.IconRowAdapter$IconRow@b1585a20 (class:
uk.org.ngo.squeezer.IconRowAdapter$IconRow) token: 3, Data:
uk.org.ngo.squeezer.IconRowAdapter$IconRow@b1585a40 (class:
uk.org.ngo.squeezer.IconRowAdapter$IconRow) token: 4, Data:
uk.org.ngo.squeezer.IconRowAdapter$IconRow@b1585a60 (class:
uk.org.ngo.squeezer.IconRowAdapter$IconRow) token: 5, Data:
uk.org.ngo.squeezer.IconRowAdapter$IconRow@b1585a80 (class:
uk.org.ngo.squeezer.IconRowAdapter$IconRow) token: 6, Data:
uk.org.ngo.squeezer.IconRowAdapter$IconRow@b1585aa0 (class:
uk.org.ngo.squeezer.IconRowAdapter$IconRow) token: 7, Data:
uk.org.ngo.squeezer.IconRowAdapter$IconRow@b1585ac0 (class:
uk.org.ngo.squeezer.IconRowAdapter$IconRow) token: 8, Data:
uk.org.ngo.squeezer.IconRowAdapter$IconRow@b1585ae0 (class:
uk.org.ngo.squeezer.IconRowAdapter$IconRow) token: 9, Data:
uk.org.ngo.squeezer.IconRowAdapter$IconRow@b1585b00 (class:
uk.org.ngo.squeezer.IconRowAdapter$IconRow) token: 10, Data:
uk.org.ngo.squeezer.IconRowAdapter$IconRow@b1585b20 (class:
uk.org.ngo.squeezer.IconRowAdapter$IconRow) token: 11]>
IconRowAdapter中有12個項目,因此我確信它正在尋找正確的適配器。
我已經找到的所有示例代碼和文檔均假定您正在嘗試在適配器中查找條目以單擊它(並且這將導致其他視圖中的值發生變化)。 我找不到任何有關如何檢查適配器中給定項目值的內容。
任何見解都深表感謝。
編輯添加:
起作用的是以下內容:
onData(anything())
.inAdapterView(withId(R.id.item_list))
.atPosition(0)
.check(matches(hasDescendant(
allOf(withId(R.id.text1), withText(containsString("Artists"))))));
如果我理解正確,那就是在測試R.id.text1視圖的值,而不是適配器中的值。 我想這對於UI測試是有意義的,但是我仍然對找出如何(如果?)可以使用Espresso在適配器中測試項目的內容感興趣。
作為參數傳遞給onData()
的匹配器必須與Adapter.getItem()
返回的值匹配。 因此,第一個版本不匹配,因為使用了錯誤的類型。 它應該是:
onData(is(instanceOf(IconRowAdapter.IconRow.class)))
在不同類型的CharSequences上使用equalTo也可能是一個陷阱。 String是一個CharSequence,但是如果IconRow.getText()返回CharSequence而不是String,那么它也可以是Spannable,Editable等,在這種情況下equalTo將不匹配。 因此,如果IconRow.getText()返回String以外的任何內容,請確保在比較之前將其轉換為String。
試試看,它必須工作:
//check that item is present in list at position 0
onData(withItemContent("Artists"))
.inAdapterView(withId(R.id.list_view))
.atPosition(0)
.check(matches(isDisplayed()));
如果刪除atPosition(0)
,則只需在適配器視圖中檢查狀態。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.