如何在 Espresso 的 RecyclerView 中断言?

新手上路,请多包涵

我正在使用 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 当然需要一个动作,所以它说第二个参数类型错误。 espresso-contrib 上没有 RecyclerViewAssertions

有什么方法可以对 RecyclerView 执行断言吗?

原文由 juhlila 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 369
2 个回答

您应该查看 Danny Roa 的解决方案 Custom RecyclerView Actions 并像这样使用它:

 onView(withRecyclerView(R.id.recycler_view)
    .atPositionOnView(1, R.id.ofElementYouWantToCheck))
    .check(matches(withText("Test text")));

原文由 HowieH 发布,翻译遵循 CC BY-SA 3.0 许可协议

相当容易。不需要额外的库。做:

     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"))));

原文由 riwnodennyk 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题