Android Kotlin Dogglers应用列表项测试年龄匹配失败咨询
Dogglers App测试用例失败问题解决
问题表现
完成Dogglers App界面开发后,界面显示效果符合预期,但执行grid_list_content_at_first_position测试用例时报错,错误信息如下:
androidx.test.espresso.NoMatchingViewException: No views in hierarchy found matching: an instance of android.widget.TextView and view.getText() with or without transformation to match: is "7"
根因分析
查看测试用例checkFirstPosition()的校验逻辑,该方法会校验列表首项的以下内容:
- 名称字段值为
"Tzeitel" - 年龄字段值为
"7" - 爱好字段值为
"sunbathing" - 对应图片资源为
R.drawable.tzeitel
测试失败的核心原因是当前年龄字段的TextView赋值为带前缀的"Age: 7",和测试要求的纯文本"7"不匹配,通过在onBindViewHolder()中添加日志打印已经验证了该问题。
当前的onBindViewHolder()实现如下:
override fun onBindViewHolder(holder: DogCardViewHolder, position: Int) { // 获取当前位置的狗狗数据 val item = dogList[position] // 设置当前狗狗的图片资源 holder.imageView?.setImageResource(item.imageResourceId) // 设置当前狗狗的名称 holder.nameView?.text = item.name // 设置当前狗狗的年龄 val resources = context?.resources holder.ageView?.text = resources?.getString(R.string.dog_age, item.age) println("AGEVIEW=${holder.ageView?.text}") // 设置当前狗狗的爱好 holder.hobbiesView?.text = resources?.getString(R.string.dog_hobbies, item.hobbies) }
当前年龄对应的字符串资源定义为:
<string name="dog_age">Age: %1$s</string>
你之前猜想的「在TextView中定义格式化字符串,仅传入纯年龄值满足测试要求」的方案不可行:如果将带占位符的格式化字符串直接设置给TextView,最终调用getText()拿到的还是拼接完成的完整字符串,依然无法匹配纯文本"7"的测试要求。
另外注意:当前爱好字段的赋值逻辑和年龄字段一致,也是拼接了前缀的完整字符串,只是Espresso断言在匹配年龄字段时就已经失败抛出异常,没有走到爱好字段的校验步骤,修改时需要同步处理。
修复方案
- 调整列表项布局文件
- 年龄行单独拆分两个TextView:一个显示固定静态文本
Age:,另一个(即原ageView)仅用来展示纯年龄数字 - 爱好行同理拆分两个TextView:一个显示固定静态文本
Hobbies:,另一个(即原hobbiesView)仅用来展示纯爱好内容
- 年龄行单独拆分两个TextView:一个显示固定静态文本
- 修改
onBindViewHolder()中的赋值逻辑,去掉字符串拼接,直接给对应控件传纯字段值:
override fun onBindViewHolder(holder: DogCardViewHolder, position: Int) { val item = dogList[position] holder.imageView?.setImageResource(item.imageResourceId) holder.nameView?.text = item.name // 直接赋值纯年龄值,不拼接前缀 holder.ageView?.text = item.age.toString() // 直接赋值纯爱好内容,不拼接前缀 holder.hobbiesView?.text = item.hobbies }
修改完成后,界面显示效果和之前完全一致,同时测试用例可以正确匹配到对应文本内容,用例即可执行通过。
内容的提问来源于stack exchange,提问作者Nicholas G
相关产品推荐
相关产品推荐

