gpt4 book ai didi

android - Espresso - 检查 RecyclerView 商品的订购是否正确

转载 作者:行者123 更新时间:2023-12-02 11:01:17 26 4
gpt4 key购买 nike

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

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

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

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

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

我现在知道onData不适用于RecyclerView,但在此之前我尝试使用自定义匹配器来完成此任务。

 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 方法的参数给出的类型,它显然不起作用,但我们是否有类似的东西可以工作?

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

请问我在这里缺少什么?非常感谢。

最佳答案

正如前面提到的 hereRecyclerView 对象与 AdapterView 对象的工作方式不同,因此 onData() 不能用于与它们交互。

为了在 RecyclerView 的特定位置找到 View ,您需要实现自定义 RecyclerViewMatcher如下所示:

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;
}

}
};
}
}

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

@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());
}

关于android - Espresso - 检查 RecyclerView 商品的订购是否正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52737309/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com