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 环境搭建步骤
- 安装 JDK 17(推荐使用 Eclipse Temurin),配置
JAVA_HOME环境变量。 - 安装 Android Studio Hedgehog (2023.1.1) 或更高版本,确保内置 Gradle 版本 ≥ 8.5。
- 通过 SDK Manager 安装 Android 14 (API 34) 的 SDK Platform、Build Tools 和 NDK(可选)。
- 创建新项目,选择“Empty Activity”,语言选 Kotlin。
- 在
build.gradle.kts(Project 级) 中配置 Gradle 与 AGP 版本。 - 在
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 环境搭建组件关系图
1.5 常见错误与解决
| 错误现象 | 根因 | 解决方案 |
|---|---|---|
| Gradle sync 失败,提示 Unsupported class file major version 65 | JDK 版本与 Gradle 不匹配(JDK 21 搭配 Gradle 8.4 以下) | 降级 JDK 至 17 或升级 Gradle 至 ≥ 8.5 |
| 测试运行时 NoClassDefFoundError: okhttp3/Response | MockWebServer 与 OkHttp 版本不一致 | 确保 mockwebserver 版本与 okhttp 版本完全一致 |
| WorkManager 测试返回 null 初始化异常 | 缺少 androidx.test.core.app.ActivityScenario 或未正确配置 TestListenableWorkerBuilder | 检查 work-testing 依赖是否添加在 testImplementation 而不是 androidTestImplementation |
| Retrofit 抛出 IllegalArgumentException: URL must start with http | MockWebServer 启动后未正确获取 baseUrl | 使用 mockWebServer.url("/").toString() 确保以 http:// 开头 |
成功标志: 执行以下命令无报错即代表环境搭建完成。
./gradlew clean :app:testDebugUnitTest --tests "*WorkerTest*"