我正在运行Espresso测试以点击RecyclerView的元素。
onView(withId(R.id.recyclerList)).perform(RecyclerViewActions.actionOnItemAtPosition(2, click()));
但是,我收到以下错误: java.lang.IllegalStateException:位置没有视图持有者
我已经检查了视图ID指向我的RecyclerView,我的依赖关系如下:
答案 0 :(得分:1)
我想,可能的问题是,当您尝试执行操作时,您的项目实际上不可见。如果是这样,您可以尝试onView(withId(R.id.recyclerList)).perform(RecyclerViewActions.scrollToPosition(2))
然后执行您的操作
答案 1 :(得分:0)
好吧,我认为我遇到了同样的问题,我设法解决了。
问题是除非您使用AsyncTask 填充RecyclerView,否则Espresso 不等待后台线程完成后再执行下一步操作。< / p>
因此,它将在位置2 中搜索该项目,并且由于您的后台线程仍在运行且尚未加载回收器视图,因此它将返回IllegalStateException。
即使我不会建议使用它,你可以通过添加Thread.sleep()(合理的时间)来检查测试是否工作得非常快,如下所示:
@Test
public void myTest() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
onView(withId(R.id.recyclerList))
.perform(RecyclerViewActions.actionOnItemAtPosition(2, click()));
//assert something
}
此问题的 更好(并且正确)解决方案 正在使用Idling Resources。
这个short and concise video确实帮助我理解了如何使用IdlingResources(特别是CountingIdlingResources)。
您的ui测试现在应该类似于:
@Test
public void myTest() {
registerIdlingResources(/*put your IdlingResource here*/);
onView(withId(R.id.recyclerList))
.perform(RecyclerViewActions.actionOnItemAtPosition(2, click()));
//assert something
}
我希望它有所帮助。
答案 2 :(得分:0)
您可以使用 real
类来确保您的数据在运行测试之前加载到您的回收器视图中,方法是在您的计数空闲对象之前调用 CountingIdlingResource
获取数据,然后在加载数据后在您的计数空闲对象上调用 increment()
。
首先要做的是添加依赖以使用 decrement()
CountingIdlingResource
在您的 Activity 中定义一个类型为 implementation 'androidx.test.espresso:espresso-idling-resource:3.3.0'
CountingIdlingResource
“Loader”只是您空闲资源的唯一 ID(来自文档:此资源应向 Espresso 报告的资源名称。)
然后在从数据源获取数据之前调用 public CountingIdlingResource idlingResource = new CountingIdlingResource("Loader");
,获取数据后调用 idlingResource.increment()
RecyclerViewTest 类中的最后一步是添加活动规则
idlingResource.decrement()
然后在您的测试方法中
@Rule
public ActivityScenarioRule<YourActivity> rule = new ActivityScenarioRule<>(YourActivity.class);