使用Espresso点击绑定Project类对象的Spinner下拉项失败如何解决
问题原因
你遇到的是Espresso操作Spinner下拉项的常见误区,核心问题有两个:
- Spinner展开后的下拉列表不属于Spinner本身的视图结构,是系统弹出的独立
PopupWindow,默认不在Espresso的默认视图搜索范围内 - 你使用ViewModel的LiveData异步加载Spinner数据,测试时可能出现数据还没加载完成就触发点击的时序问题,导致下拉项为空无法匹配
解决步骤
1. 前置配置(解决异步数据加载时序问题)
如果你的项目使用了Jetpack架构组件,在测试类中添加InstantTaskExecutorRule,让LiveData的回调同步执行,避免异步延迟:
@Rule public InstantTaskExecutorRule instantTaskExecutorRule = new InstantTaskExecutorRule();
2. 正确的下拉项点击代码
按文本匹配(适配你重写了toString()的Project类)
点击Spinner展开下拉框后,使用以下代码点击对应文本的选项:
onData(allOf(is(instanceOf(Project.class)), hasToString("Projet Lucidia"))) .inRoot(isPlatformPopup()) // 关键:指定搜索系统弹出的PopupWindow视图 .perform(click());
按位置匹配
如果要点击指定位置的下拉项(比如下标为1的第二个选项),使用以下代码:
onData(anything()) .atPosition(1) .inRoot(isPlatformPopup()) .perform(click());
原有方案失效的原因说明
- 方案1的
onView(withText)默认只搜索当前Activity的窗口视图,不会搜索弹出的下拉窗口,因此找不到目标项 - 方案2的
inAdapterView(withId(R.id.project_spinner))配置错误,下拉列表的AdapterView不属于Spinner控件本身,完全匹配不到视图 - 方案3缺少
inRoot(isPlatformPopup())配置,搜索范围不对无法找到下拉项 - 方案4的
withSpinnerText是用来匹配Spinner当前已选中的文本,不是用来匹配下拉列表中的待选项
内容的提问来源于stack exchange,提问作者Emmcy
相关产品推荐
相关产品推荐

