浓咖啡-检查RecyclerView物品是否正确订购 [英] Espresso - Check RecyclerView items are ordered correctly
问题描述
如何使用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屋!