浓咖啡-检查RecyclerView物品是否正确订购 [英] Espresso - Check RecyclerView items are ordered correctly

查看:53
本文介绍了浓咖啡-检查RecyclerView物品是否正确订购的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何使用Espresso检查RecyclerView项目是否以正确的顺序显示?我正在尝试通过对每个元素的标题的文本进行检查来对其进行测试.

How to go about checking whether RecyclerView items are displayed in the correct order using Espresso? I'm trying to test it checking it by the text for the title of each element.

当我尝试这段代码时,它可以单击该元素,但是不能继续执行,而只能执行单击以尝试断言该元素的文本

When I try this piece of code it works to click the element but can't go on to instead of performing a click trying to Assert the text for the element

onView(withId(R.id.rv_metrics)).perform(actionOnItemAtPosition(0, click()));

当我尝试使用自定义匹配器时,我不断收到错误消息

When I try to use a custom matcher instead I keep getting the error

Error performing 'load adapter data' on view 'with id: mypackage_name:id/rv_metrics'

我现在知道onData doesn't work for RecyclerView,但在此之前,我试图使用自定义匹配器来完成此任务.

I know now onData doesn't work for RecyclerView but before that I was trying to use a custom matcher for this task.

 public static Matcher<Object> hasTitle(final String inputString) {
    return new BoundedMatcher<Object, Metric>(Metric.class) {
        @Override
        protected boolean matchesSafely(Metric metric) {

            return inputString.equals(metric.getMetric());

        }

        @Override
        public void describeTo(org.hamcrest.Description description) {
            description.appendText("with title: ");
        }
    };
}

我也尝试过类似的方法,但是由于作为actionOnItemAtPosition方法的参数给出的类型,它显然不起作用,但是我们是否有类似的方法可以起作用?

I also tried something like this but it obviously doesn't work due to the type given as parameter to the actionOnItemAtPosition method but would we have something similar to it that could maybe work?

onView(withId(R.id.rv_metrics)).check(actionOnItemAtPosition(0, ViewAssertions.matches(withText("Weight"))));

请问我在这里想念什么? 非常感谢.

What am I missing here please? Thanks a lot.

推荐答案

如前所述在此RecyclerView对象的工作方式不同于AdapterView对象,因此onData()无法用于与其交互.

As it's been mentioned here, RecyclerView objects work differently than AdapterView objects, so onData() cannot be used to interact with them.

为了在RecyclerView的特定位置查找视图,您需要实现自定义

In order to find a view at specific position of a RecyclerView you need to implement a custom RecyclerViewMatcher like below:

public class RecyclerViewMatcher {
    private final int recyclerViewId;

    public RecyclerViewMatcher(int recyclerViewId) {
        this.recyclerViewId = recyclerViewId;
    }

    public Matcher<View> atPosition(final int position) {
        return atPositionOnView(position, -1);
    }

    public Matcher<View> atPositionOnView(final int position, final int targetViewId) {

        return new TypeSafeMatcher<View>() {
            Resources resources = null;
            View childView;

            public void describeTo(Description description) {
                String idDescription = Integer.toString(recyclerViewId);
                if (this.resources != null) {
                    try {
                        idDescription = this.resources.getResourceName(recyclerViewId);
                    } catch (Resources.NotFoundException var4) {
                        idDescription = String.format("%s (resource name not found)",
                                                      new Object[] { Integer.valueOf
                                                          (recyclerViewId) });
                    }
                }

                description.appendText("with id: " + idDescription);
            }

            public boolean matchesSafely(View view) {

                this.resources = view.getResources();

                if (childView == null) {
                    RecyclerView recyclerView =
                        (RecyclerView) view.getRootView().findViewById(recyclerViewId);
                    if (recyclerView != null && recyclerView.getId() == recyclerViewId) {
                        childView = recyclerView.findViewHolderForAdapterPosition(position).itemView;
                    }
                    else {
                        return false;
                    }
                }

                if (targetViewId == -1) {
                    return view == childView;
                } else {
                    View targetView = childView.findViewById(targetViewId);
                    return view == targetView;
                }

            }
        };
    }
}

然后以这种方式在测试用例中使用它:

And then use it in your test case in this way:

@Test
void testCase() {
    onView(new RecyclerViewMatcher(R.id.rv_metrics)
        .atPositionOnView(0, R.id.txt_title))
        .check(matches(withText("Weight")))
        .perform(click());

    onView(new RecyclerViewMatcher(R.id.rv_metrics)
        .atPositionOnView(1, R.id.txt_title))
        .check(matches(withText("Height")))
        .perform(click());
}

这篇关于浓咖啡-检查RecyclerView物品是否正确订购的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆