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

Kotlin测试中如何正确断言TextView中的多行文本内容

问题原因

你的报错核心是换行符没有被TextView正确识别渲染,或者Espresso默认匹配器没有匹配到原始文本内容,两种常见触发场景:

  1. TextView布局配置限制了多行显示,自动过滤了换行符
  2. Espresso自带的withText匹配器匹配的是经过布局渲染后的可见文本,不是你传入的原始字符串

解决步骤

1. 修正TextView布局配置

检查第二个页面R.id.my_text_label对应的TextView属性,确保配置如下:

<TextView
    android:id="@+id/my_text_label"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    <!-- 禁止单行配置,会吃掉所有换行 -->
    android:singleLine="false"
    <!-- 允许多行显示 -->
    android:inputType="textMultiLine"
    <!-- 可选,设置最大行数,不设置则无限制 -->
    android:maxLines="10" />

2. 替换自定义文本匹配器

如果布局配置没问题,就是Espresso默认withText的匹配规则不符合预期,自定义Matcher直接匹配TextView的原始文本内容:
首先定义自定义Matcher:

fun withOriginalText(expected: String): Matcher<View> {
    return object : TypeSafeMatcher<View>() {
        override fun matchesSafely(item: View): Boolean {
            if (item !is TextView) return false
            return item.text.toString() == expected
        }

        override fun describeTo(description: Description) {
            description.appendText("expected original text: $expected")
        }
    }
}

然后修改你的测试断言代码:

Espresso.onView(ViewMatchers.withId(R.id.my_text_label))
    .check(ViewAssertions.matches(ViewMatchers.withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE)))
    // 替换成自定义Matcher
    .check(ViewAssertions.matches(withOriginalText("Text: $textToPass")))

3. 统一换行符格式(可选)

如果是从EditText取输入内容时换行符格式不统一(EditText默认输入的换行是\r\n,部分场景下会被TextView过滤),可以在传值时统一替换:

// 第一个Activity跳转前取输入内容的代码
val inputContent = editText.text.toString().replace("\r\n", "\n")
// 再把inputContent通过Intent传到第二个页面

内容的提问来源于stack exchange,提问作者Mario

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 10:42:02