如何为Kotlin中TextView的加粗扩展函数编写测试用例?
测试方案建议
你可以根据需求选择两种测试路径,不需要额外依赖第三方UI测试框架也可以完成验证:
方案1:使用Robolectric做本地单元测试(推荐,运行速度快,无需真机/模拟器)
这种方案可以直接在JVM上运行测试,耗时短,适合快速验证逻辑正确性:
- 首先在模块级
build.gradle的testImplementation依赖中添加Robolectric和JUnit相关依赖 - 测试逻辑步骤:
- 新建一个TextView实例,给它设置原始文本,比如
Hello World Test - 调用扩展函数,传入要加粗的文本,比如
"World" - 从TextView取出Spannable内容,遍历查找所有
StyleSpan - 验证对应位置的Span确实是
Typeface.BOLD,并且位置匹配传入的文本起止位置
- 新建一个TextView实例,给它设置原始文本,比如
- 示例测试代码:
@RunWith(RobolectricTestRunner::class) class TextViewExtTest { @Test fun `makeSectionOfTextBold sets correct span for existing text`() { val textView = TextView(ApplicationProvider.getApplicationContext()) val originalText = "Hello World Test" textView.text = originalText val boldText = "World" textView.makeSectionOfTextBold(boldText) val spannable = textView.text as Spannable val spans = spannable.getSpans(0, spannable.length, StyleSpan::class.java) val targetSpan = spans.firstOrNull { it.style == Typeface.BOLD } assertNotNull(targetSpan) assertEquals(originalText.indexOf(boldText), spannable.getSpanStart(targetSpan)) assertEquals(originalText.indexOf(boldText) + boldText.length, spannable.getSpanEnd(targetSpan)) } @Test fun `makeSectionOfTextBold does nothing when text not exist`() { val textView = TextView(ApplicationProvider.getApplicationContext()) textView.text = "Hello World" textView.makeSectionOfTextBold("NotFound") val spannable = textView.text as Spannable val spans = spannable.getSpans(0, spannable.length, StyleSpan::class.java) assertEquals(0, spans.size) } }
方案2:Instrumented测试(跑在真机/模拟器上)
如果要验证实际渲染效果,可以用这种方案:
- 依赖androidTestImplementation的JUnit、Espresso基础依赖
- 测试时在测试布局中加入一个TextView,设置文本后调用扩展函数,再断言对应区域的Span属性符合预期
- 也可以配合Espresso的自定义Matcher来验证文本的加粗状态,适合和UI流程结合的测试场景
额外优化提示
你当前的实现存在一个小局限:如果同一段要加粗的文本在内容中出现多次,只会给第一次出现的内容添加加粗效果,如果需要支持全量匹配,可以把单次indexOf查找替换为循环查找所有匹配位置后再依次设置Span。
内容的提问来源于stack exchange,提问作者Asfar
相关产品推荐
相关产品推荐

