我正在使用 espresso-contrib 对 RecyclerView
执行操作,它可以正常工作,例如:
//click on first item
onView(withId(R.id.recycler_view))
.perform(RecyclerViewActions.actionOnItemAtPosition(0, click()));
我需要对其执行断言。像这样的:
onView(withId(R.id.recycler_view))
.perform(
RecyclerViewActions.actionOnItemAtPosition(
0, check(matches(withText("Test Text")))
)
);
但是,因为 RecyclerViewActions当然,期待一个 Action ,它说错误的第二个参数类型。 espresso-contrib 上没有 RecyclerViewAssertions
。
有没有办法在 RecyclerView
上执行断言?
最佳答案
很简单。不需要额外的库。做:
onView(withId(R.id.recycler_view))
.check(matches(atPosition(0, withText("Test Text"))));
如果您的 ViewHolder 使用 ViewGroup,请将 withText()
包装为 hasDescendant()
,例如:
onView(withId(R.id.recycler_view))
.check(matches(atPosition(0, hasDescendant(withText("Test Text")))));
你可以将方法放入 Utils
类中。
public static Matcher<View> atPosition(final int position, @NonNull final Matcher<View> itemMatcher) {
checkNotNull(itemMatcher);
return new BoundedMatcher<View, RecyclerView>(RecyclerView.class) {
@Override
public void describeTo(Description description) {
description.appendText("has item at position " + position + ": ");
itemMatcher.describeTo(description);
}
@Override
protected boolean matchesSafely(final RecyclerView view) {
RecyclerView.ViewHolder viewHolder = view.findViewHolderForAdapterPosition(position);
if (viewHolder == null) {
// has no item on such position
return false;
}
return itemMatcher.matches(viewHolder.itemView);
}
};
}
如果您的项目一开始可能在屏幕上不可见,请先滚动到它:
onView(withId(R.id.recycler_view))
.perform(scrollToPosition(87))
.check(matches(atPosition(87, withText("Test Text"))));
关于java - 如何在 Espresso 的 RecyclerView 中断言?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31394569/