java - 如何在 Espresso 的 RecyclerView 中断言?

标签 java android android-espresso

我正在使用 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/

相关文章:

java - 在 java 中,使用 "new"初始化数组有什么好处?

java.lang.ArrayIndexOutOfBoundsException : -85 java alogrithm

java - 将 pdf 转换为缩略图并将该数据也保存到 solr 中吗?

android - 当我从 fragment Activity 导航到另一个 Activity 时, fragment Activity 调用销毁方法

android - AppCompat 库 23.2.1 不适用于 espresso v2.2.2

javascript - Selenium:如何点击 javascript 按钮

android - 如何创建这样的按钮组?

javascript - React Native 动画组件在平移时被覆盖

android - 如何自动化 android 的升级测试

Android Espresso 如何执行触摸事件