JUnit 5 在 Android 测试中的配置与使用
JUnit 5 在 Android 测试中的配置与使用
去年把项目 AGP 从 7.4 升到 8.1 时,测试流水线炸了一整天。不是业务逻辑挂,而是测试任务直接抛 NoSuchMethodError,堆栈指向 com.android.build.gradle.tasks.factory.AndroidUnitTest 的内部方法。排查后才发现,Android Gradle Plugin 对 JUnit 的默认支持几乎冻结在了 JUnit 4,而团队当时为了用参数化测试覆盖一组时区边缘 case,已经私下引入了 JUnit 5 的依赖。依赖能编译,但 ./gradlew test 始终报告 zero tests executed——没有任何报错,只是静默跳过。这种「编译通过但运行消失」的体验,是 Android 开发者初探 JUnit 5 时最典型的陷阱。
Android 官方测试栈的断层
即便到了 AGP 8.2,你用 Android Studio Hedgehog 新建一个模块,模板自动注入的测试依赖依然是 junit:junit:4.13.2。Google 的 AndroidX Test 生态,从 androidx.test:runner 到 Espresso,再到 Hilt 的测试入口,底层全部围绕 JUnit 4 的 AndroidJUnitRunner 设计。这意味着官方从未原生支持 JUnit 5 的 Jupiter 引擎。
在普通 Java/Kotlin 项目里,你只需要在 Gradle 里写 useJUnitPlatform() 并引入 junit-jupiter 依赖,Gradle 的 Test 任务就能自动识别并执行。但 AGP 的单元测试任务类型是 AndroidUnitTest,它不是标准 Gradle Test 任务的子类,JUnit Platform 的 Gradle 插件根本挂不上去。于是你会看到 IDE 里测试类图标正常,点击单测也能跑(因为 IDE 可能直接用了自己的 JUnit 5 运行器),但命令行 CI 里全部失踪。
更隐蔽的问题在仪器测试侧。connectedCheck 依赖的 androidx.test.runner.AndroidJUnitRunner 继承自 JUnit 4 的 AndroidJUnit4ClassRunner,它的类扫描逻辑只认 org.junit.Test 注解,不认 org.junit.jupiter.api.Test。所以如果你直接在 androidTest 源码里写 Jupiter 的 @Test,APK 编译成功,装到设备上后 Runner 会报告「找不到任何测试」,然后干净利落地结束。
android-junit5 插件是目前唯一的选择
要让 JUnit 5 在 Android 项目里真正跑通,目前社区里唯一成熟的选择是 Marco Ranieri 维护的 `de.mannodermaus