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)

测试环境搭建流程 创建/定位项目 编辑 app/build.gradle 添加 AndroidX Test + JUnit5 依赖 加入 Mockito/KotlinMock 引入 Robolectric 配置 Test Runner Sync Gradle 运行第一个 @Test 验证 Green Bar
性能与稳定性提示:
· 初次 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。