SuperAPI AI 工具集

picking-test-doubles

测试与质量

查看项目

更新于 10-16 02:58

技能介绍

用途

本技能帮助开发者在编写 Android 测试时,从六种测试替身(fake、mock、stub、spy、dummy、Robolectric shadow)中选出最合适的一种。它编码了 Google 在 developer.android.com/training/testing/fundamentals/test-doubles 页面中三次明确表述的偏好顺序,并提供了决策矩阵与具体示例。

主要能力

  • 提供六种测试替身的逐字定义:Fake、Mock、Stub、Spy、Dummy、Shadow。
  • 给出 Google 的偏好顺序:Fake > Mock ≈ Stub > Spy;Dummy 不在排序中,Shadow 是专用于框架类的 fake。
  • 提供决策矩阵,根据测试意图(需要状态替身、验证交互、预设返回值、部分真实/部分伪造、占位参数、替换 Android 框架类)推荐对应替身。
  • 包含 Android 具体示例:FakeUserRepository 内存映射、mockk/Mockito 交互验证、stub 预设返回值、spy 包装真实对象、dummy 占位、ShadowSystemClock 控制时间。
  • 提供 WRONG vs RIGHT 模式对比,涵盖用 mock 提供状态、在 fake 上验证调用、过度使用 spy、Hilt 测试绑定替换等常见错误。
  • 列出强制规则,如优先 fake、交互断言用 mock、避免 spy、不验证框架调用、不逐字复制官方示例中的语法错误。

使用方式

当用户询问测试替身选择、替换依赖、审查过度 mock 的 PR、提及 Robolectric shadow 或使用 every { } 仅提供数据而无行为测试时,应用本技能。技能本身不涉及 mocking 框架的机制(如 whenever/every/verify/argumentCaptor),这些由同级技能处理。使用前需确保测试目标依赖可注入(构造器注入或基于接口的 DI),并已添加 mockito-core + mockito-kotlin 或 io.mockk:mockk 依赖;若使用 shadow,需添加 org.robolectric:robolectric 并设置 testOptions.unitTests.includeAndroidResources = true。

适用场景

  • 用户问“该用 fake 还是 mock”“Mockito 还是 MockK”“stub 和 spy 有什么区别”。
  • 用户替换测试中的依赖,不确定选哪种替身。
  • 代码审查中发现到处使用 verify(repo).getUser(any()),怀疑过度 mock。
  • 用户提到 Robolectric shadow,询问其在测试替身分类中的位置。
  • 用户使用 every { repo.getUser() } returns User('Alice') 但没有被测行为,应建议改用 fake。

限制

  • 不适用于已选定 fake/mock 后需要框架机制的情况,应使用 mocking-with-mockito 或 mocking-with-mockk 技能。
  • 不适用于 Hilt 绑定替换的完整策略,需结合 applying-testing-strategies 技能。
  • 不适用于选择测试内容,应使用 choosing-what-to-test 技能。
  • 不适用于调试 Robolectric shadow 在特定 API 上抛错,应使用 using-robolectric-correctly 技能。
  • 测试目标必须支持依赖注入,硬编码单例无法直接替换替身。
  • 官方示例中的 FakeUserRepository 片段包含语法错误 val const UserAlice = User(...),必须使用修正版本(private val 或 const val)。