RecyclerView Espresso测试触发androidx.test.espresso.PerformException如何解决
故障排查与解决方案
核心原因1:异步数据加载时序不匹配
你是从数据库预加载数据,这类IO操作通常在子线程执行,而Espresso默认只会等待主线程任务队列清空,不会等待子线程的IO任务完成。测试代码执行时,数据还没完成绑定到RecyclerView,所以匹配不到对应条目。
解决方法
- 临时验证方案:在测试代码前加入2s等待,确认是否是时序问题:
Thread.sleep(2000);
- 正式测试方案:自定义IdlingResource监听数据加载状态,Espresso会等待IdlingResource进入空闲状态后再执行后续测试逻辑,不会产生无用的等待时间。
核心原因2:匹配规则过于宽泛
你当前用的hasDescendant(withText("name 99"))会匹配itemView下所有子View的文本,很可能出现匹配偏差,另外如果文本前后存在空格、不可见字符,精准匹配也会失败。
解决方法
优化匹配规则,精准绑定你要校验的accountType文本控件:
onView(withId(R.id.accountView)) .perform(RecyclerViewActions.scrollTo( hasDescendant(allOf(withId(R.id.accountType), withText("name 99"))) )); // 滚动完成后补充校验,确认条目可见 onView(allOf(withId(R.id.accountType), withText("name 99"))) .check(matches(isDisplayed()));
如果怀疑文本存在不可见字符,可以换成模糊匹配:
withText(containsString("name 99"))
核心原因3:滚动逻辑冲突
如果你的RecyclerView嵌套在NestedScrollView/ScrollView中,Espresso默认的RecyclerView滚动动作只会操作RecyclerView自身,嵌套场景下无法正常滚动到对应条目。
解决方法
给RecyclerView关闭嵌套滚动属性:
<androidx.recyclerview.widget.RecyclerView android:id="@+id/accountView" android:nestedScrollingEnabled="false" .../>
内容的提问来源于stack exchange,提问作者AShX
相关产品推荐
相关产品推荐

