1. 环境搭建:JDK、Gradle、Android SDK、Retrofit 库版本、Worker 测试依赖与 MockWebServer 配置

本章是课程的基石,目标是在开发机器上搭建一套完整、可复现的测试环境,使后续章节的 Retrofit 响应处理与 Worker 测试能够正确编译和执行。环境搭建的核心原则是“版本对齐”——主库、测试框架、模拟服务器三者之间的版本兼容性,直接影响测试用例的稳定性。

1.1 各组件版本要求

下表列出推荐的最低版本与已验证的最新兼容版本。除非有特殊需求,否则建议严格按照该组合搭建,以避免因 API 变更导致的意外失败。

组件 最低版本 推荐版本 说明
JDK 11 17 Android Gradle Plugin 8.x 要求 JDK 17+
Gradle 8.2 8.5 配合 AGP 8.x 使用,支持配置缓存
Android SDK 34 34 编译目标与 API 级别一致
Retrofit 2.9.0 2.11.0 依赖 OkHttp 4.12,支持 Kotlin 协程
WorkManager 2.9.0 2.10.0 Worker 测试依赖 work-testing
MockWebServer 4.12.0 4.12.0 与 Retrofit 使用的 OkHttp 版本匹配
JUnit / Truth 4.13.2 / 1.4.0 4.13.2 / 1.4.0 断言库,配合 Robolectric 使用

1.2 环境搭建步骤

  1. 安装 JDK 17(推荐使用 Eclipse Temurin),配置 JAVA_HOME 环境变量。
  2. 安装 Android Studio Hedgehog (2023.1.1) 或更高版本,确保内置 Gradle 版本 ≥ 8.5。
  3. 通过 SDK Manager 安装 Android 14 (API 34) 的 SDK Platform、Build Tools 和 NDK(可选)。
  4. 创建新项目,选择“Empty Activity”,语言选 Kotlin。
  5. 在 build.gradle.kts (Project 级) 中配置 Gradle 与 AGP 版本。
  6. 在 build.gradle.kts (Module 级) 中添加以下依赖。
dependencies {
    // Core
    implementation("com.squareup.retrofit2:retrofit:2.11.0")
    implementation("com.squareup.retrofit2:converter-gson:2.11.0")
    implementation("com.squareup.okhttp3:okhttp:4.12.0")
    implementation("com.squareup.okhttp3:logging-interceptor:4.12.0")

    // WorkManager
    implementation("androidx.work:work-runtime-ktx:2.10.0")
    // WorkManager 测试支持
    androidTestImplementation("androidx.work:work-testing:2.10.0")

    // 单元测试(运行在 JVM,不依赖 Android 设备)
    testImplementation("junit:junit:4.13.2")
    testImplementation("com.google.truth:truth:1.4.0")
    testImplementation("com.squareup.okhttp3:mockwebserver:4.12.0")
    testImplementation("org.robolectric:robolectric:4.12.1")
    testImplementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:1.8.1")

    // Android Instrumented 测试(需要设备/模拟器)
    androidTestImplementation("androidx.test.ext:junit:1.2.1")
    androidTestImplementation("com.google.truth:truth:1.4.0")
}

版本匹配提醒: Retrofit 2.11.0 强制要求 OkHttp ≥ 4.12.0,MockWebServer 必须与 OkHttp 使用相同主版本(即 4.12.x),否则运行时会出现 NoClassDefFoundError。

1.3 MockWebServer 在测试中的基础配置

MockWebServer 是一个轻量级的本地 HTTP 服务器,能够模拟真实的后端端点。在 Worker 测试中,我们用它来返回预定义的 JSON 响应,从而隔离网络层。

// 测试基类示例
import okhttp3.mockwebserver.MockWebServer

class WorkerTestBase {
    private val mockWebServer = MockWebServer()

    @Before
    fun setUp() {
        mockWebServer.start(8080) // 绑定到随机端口
        // 将 Retrofit 的 baseUrl 指向 MockWebServer
        val baseUrl = mockWebServer.url("/").toString()
        // 随后在测试中替换 Retrofit 实例的 baseUrl
    }

    @After
    fun tearDown() {
        mockWebServer.shutdown()
    }

    fun enqueueResponse(responseBody: String, responseCode: Int = 200) {
        val mockResponse = MockResponse()
            .setResponseCode(responseCode)
            .setBody(responseBody)
            .setHeader("Content-Type", "application/json")
        mockWebServer.enqueue(mockResponse)
    }
}

1.4 环境搭建组件关系图

环境搭建核心组件关系图 开发机 JDK 17 + Gradle 8.5 Android SDK API 34 / Build Tools 34 项目 build.gradle 依赖声明 MockWebServer 本地 HTTP 模拟服务器 Worker 测试 work-testing + Robolectric 版本对齐关键链条 Retrofit → OkHttp → MockWebServer 必须使用完全相同的 OkHttp 主要+次要版本

1.5 常见错误与解决

错误现象根因解决方案
Gradle sync 失败,提示 Unsupported class file major version 65JDK 版本与 Gradle 不匹配(JDK 21 搭配 Gradle 8.4 以下)降级 JDK 至 17 或升级 Gradle 至 ≥ 8.5
测试运行时 NoClassDefFoundError: okhttp3/ResponseMockWebServer 与 OkHttp 版本不一致确保 mockwebserver 版本与 okhttp 版本完全一致
WorkManager 测试返回 null 初始化异常缺少 androidx.test.core.app.ActivityScenario 或未正确配置 TestListenableWorkerBuilder检查 work-testing 依赖是否添加在 testImplementation 而不是 androidTestImplementation
Retrofit 抛出 IllegalArgumentException: URL must start with httpMockWebServer 启动后未正确获取 baseUrl使用 mockWebServer.url("/").toString() 确保以 http:// 开头

成功标志: 执行以下命令无报错即代表环境搭建完成。

./gradlew clean :app:testDebugUnitTest --tests "*WorkerTest*"

1.6 本章小结