1. 搭建测试环境:配置 Gradle 依赖、AndroidX Test 库、Mockito/KotlinMock、JUnit5 设置、Robolectric 选择
单元测试的可靠性直接取决于测试环境的正确搭建。本章将引导你从零配置一个基于 AndroidX Test、JUnit5、Mockito / KotlinMock 和 Robolectric 的现代测试项目。所有依赖、运行器、版本约束都必须精确对齐,否则会出现 ClassNotFoundException 或 Instrumentation 冲突。
核心原则:测试环境的 Gradle 配置必须与主模块的 compileSdk / targetSdk / Kotlin 版本保持兼容。下文给出的版本号符合 2025 年稳定生态,实际使用时可参考各库的 Compatibility Matrix 升级。
1.1 依赖全景表
下表列出每类库的核心用途、推荐版本及声明方式。所有依赖放在模块级 build.gradle 的 dependencies 块中。
| 库类别 | Maven 坐标(GroupId:ArtifactId) | 推荐版本 | 作用域 | 备注 |
|---|---|---|---|---|
| 核心 AndroidX Test | androidx.test:core | 1.6.1 | testImplementation | 提供 ApplicationProvider、TaskExecutor |
| JUnit 扩展(JUnit5) | androidx.test.ext:junit | 1.2.1 | testImplementation | 兼容 JUnit5 @Test 注解 |
| JUnit5 原生支持 | org.junit.jupiter:junit-jupiter-api | 5.11.0 | testImplementation | 需要同时配置 testInstrumentationRunnerArguments |
| Mockito(Java) | org.mockito:mockito-core | 5.14.2 | testImplementation | Java 项目首选 |
| KotlinMock | org.mockito.kotlin:mockito-kotlin | 5.4.0 | testImplementation | Kotlin DSL 原生支持,含 mock()、every { ... } |
| Robolectric | org.robolectric:robolectric | 4.14.1 | testImplementation | 模拟 Android 框架,无需真机或模拟器 |
| 测试运行器(引擎) | org.junit.platform:junit-platform-runner | 1.11.0 | testImplementation | JUnit5 平台运行器 |
1.2 完整 Gradle 配置片段
将以下代码加入 app/build.gradle(Kotlin DSL 风格),同时确保 android 块中包含 testInstrumentationRunner 和 testOptions:
// app/build.gradle.kts
android {
compileSdk = 35
defaultConfig {
targetSdk = 35
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
// JUnit5 需要额外传递参数
testInstrumentationRunnerArguments["runnerBuilder"] =
"de.mannodermaus.junit5.AndroidJUnit5Builder"
}
testOptions {
unitTests.isReturnDefaultValues = true
unitTests.isIncludeAndroidResources = true // Robolectric 必需
}
}
dependencies {
// AndroidX Test 核心
testImplementation("androidx.test:core:1.6.1")
// JUnit5 原生 API
testImplementation("org.junit.jupiter:junit-jupiter-api:5.11.0")
testImplementation("org.junit.jupiter:junit-jupiter-params:5.11.0")
testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.11.0")
// JUnit5 AndroidX 桥接
testImplementation("androidx.test.ext:junit:1.2.1")
testImplementation("org.junit.platform:junit-platform-runner:1.11.0")
// Mockito / KotlinMock
testImplementation("org.mockito:mockito-core:5.14.2")
testImplementation("org.mockito.kotlin:mockito-kotlin:5.4.0")
// Robolectric
testImplementation("org.robolectric:robolectric:4.14.1")
}
版本对齐检查点:JUnit5 与 AndroidX Test 的兼容需要
androidx.test.ext:junit:1.2.1+ 配合 junit-jupiter-api:5.10+。若使用 mockito-kotlin 5.x,必须将 Kotlin 版本提升至 1.9+,否则 lambda 解析会失败。
1.3 JUnit5 与 Robolectric 的选择逻辑
- JUnit5 vs JUnit4:JUnit5 提供
@ParameterizedTest、@Nested和更好的扩展模型。AndroidX Test ext:junit 已原生支持 JUnit5 运行器,但需要显式声明testInstrumentationRunnerArguments。 - Robolectric vs 真机/模拟器:Robolectric 在 JVM 内模拟 Android 框架,适合纯逻辑 + 少量 UI 交互的单元测试;启动速度 < 2s,远快于模拟器。缺点是部分 Android 14+ 的新 API 可能尚未模拟,需通过
@Config(sdk = [34])降级 SDK。
1.4 常见错误与调试
| 错误现象 | 原因 | 解决方案 |
|---|---|---|
java.lang.IllegalStateException: No test runnable found |
缺少 JUnit5 引擎或运行器配置错误 | 确保添加 junit-jupiter-engine 并正确设置 testInstrumentationRunnerArguments |
Failed to resolve: org.robolectric:robolectric:4.14.1 |
仓库未包含 google() 或 mavenCentral() |
在 settings.gradle.kts 中添加 mavenCentral() 和 google() |
Method ... not mocked |
Robolectric 未处理该类,或缺少 @Config(application = Application::class) |
添加 testOptions.unitTests.isIncludeAndroidResources = true 或在测试类上加 @RunWith(RobolectricTestRunner::class) |
KotlinMock: java.lang.NoSuchMethodError |
mockito-kotlin 版本与 mockito-core 不匹配 | 确保两者版本遵循 mockito-kotlin 5.x → mockito-core 5.x 映射 |
1.5 环境搭建流水线(SVG)
性能与稳定性提示:
· 初次 Sync 后如果 Robolectric 报告
· JUnit5 + Mockito 同时使用时,务必避免
· KotlinMock 5.x 引入了新的
· 初次 Sync 后如果 Robolectric 报告
missing native library,请检查 JDK 版本是否为 17(推荐 Eclipse Temurin)。· JUnit5 + Mockito 同时使用时,务必避免
mockito-inline 与 mockito-core 的版本冲突 —— 只保留一个 mockito-core 即可。· KotlinMock 5.x 引入了新的
mockStatic 支持,但要求测试运行器为 @RunWith(MockitoJUnitRunner::class) 或显式调用 MockitoSession。