You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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断言在匹配年龄字段时就已经失败抛出异常,没有走到爱好字段的校验步骤,修改时需要同步处理。

修复方案

  1. 调整列表项布局文件
    • 年龄行单独拆分两个TextView:一个显示固定静态文本Age: ,另一个(即原ageView)仅用来展示纯年龄数字
    • 爱好行同理拆分两个TextView:一个显示固定静态文本Hobbies: ,另一个(即原hobbiesView)仅用来展示纯爱好内容
  2. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 06:57:30