Android中使用Espresso检查带系统ID的ListView内TextView值的问题
解决系统ID ListView的Espresso测试匹配问题
别担心,这个问题其实挺常见的,我来帮你理清楚!
首先,你的布局里用的是系统预设的android:id/list,对应的正确引用确实是android.R.id.list,但你遇到找不到视图的错误,大概率是这几个原因:
1. 导入错误的R类
你可能不小心导入了自己应用包下的R类,而不是系统的android.R。解决方法很简单:
- 要么在代码里直接写完整路径:
android.R.id.list - 要么确保导入的是
import android.R;(不过如果你的项目里已经导入了自己的R,可能会有冲突,更推荐用完整路径)
2. 你的Activity不是ListActivity/ListFragment
系统的android:id/list是专门给ListActivity或ListFragment默认使用的ListView ID。如果你的Activity是普通的Activity,那你需要先确认这个ListView确实被正确加载到视图层级里了。可以先加一句测试来验证:
onView(withId(android.R.id.list)).check(matches(isDisplayed()));
如果这句也报错,那说明你的ListView可能没有被正确渲染,或者被其他视图遮挡了。
3. 数据加载的异步问题
如果你的ListView是异步加载数据的,那Espresso可能在视图还没填充完成就去查找了。这时候你需要用IdlingResource来等待数据加载完成,或者添加一个简单的等待逻辑(不过更推荐用IdlingResource,更可靠)。
修正后的完整代码示例
onData(anything()) .inAdapterView(withId(android.R.id.list)) .atPosition(0) .onChildView(withId(R.id.numeration)) .check(matches(withText("1")));
注意这里的android.R.id.list是完整引用,避免了和自己应用的R类冲突。
最后一招:如果还是找不到,换个匹配方式
如果以上方法都不行,你可以通过类型来匹配ListView,而不是ID:
onData(anything()) .inAdapterView(isAssignableFrom(ListView.class)) .atPosition(0) .onChildView(withId(R.id.numeration)) .check(matches(withText("1")));
这种方式会匹配布局里第一个ListView,适合你只有一个ListView的场景。
内容的提问来源于stack exchange,提问作者Nur4I
相关产品推荐
相关产品推荐

