环境搭建:Kotlin/Gradle项目配置、依赖引入
好,咱们正式开始动手。这一章我带你搭一个干净利落的 Kotlin + Gradle 项目,把 MockK 和 JUnit5 的依赖一股脑儿配好。别小看这一步——我当年踩过的坑,一半都是因为环境没理清。
说实话,很多教程让你直接复制粘贴一段配置就完事,结果跑起来报错根本不知道哪的问题。我习惯先理清整体流程,再动手写代码。你跟着我的节奏来,十五分钟就能搭好。
整体流程先过一遍
环境搭建说白了就四步:创建项目 → 配置 Gradle 脚本 → 添加依赖 → 验证可运行。我画了个流程图,你一眼就能看明白。
第一步:创建 Kotlin 项目
我习惯用 IntelliJ IDEA 直接新建一个 Gradle 项目。语言选 Kotlin,构建脚本选 Kotlin DSL(就是 .kts 文件)。
你也可以用手动创建,无非就是建个目录,里面放上 settings.gradle.kts 和 build.gradle.kts。我建议还是用 IDE 省心,不然配目录结构容易出错。
第二步:配置 build.gradle.kts
这是重点。直接上我惯用的配置模板,你复制过去改一下项目名就行。
plugins {
kotlin("jvm") version "1.9.22" // Kotlin 版本
id("io.kotest") version "0.4.10" // 可选,如果你用 Kotest 测试框架
}
group = "com.example"
version = "1.0-SNAPSHOT"
repositories {
mavenCentral()
}
dependencies {
// Kotlin 标准库
implementation(kotlin("stdlib"))
// MockK 核心库
testImplementation("io.mockk:mockk:1.13.10")
// JUnit5 基础
testImplementation("org.junit.jupiter:junit-jupiter-api:5.10.2")
testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.10.2")
// 可选:参数化测试支持
testImplementation("org.junit.jupiter:junit-jupiter-params:5.10.2")
}
tasks.test {
useJUnitPlatform()
}
⚠️ 曾经我犯过的错: 把 testImplementation 写成了 implementation,导致运行测试时找不到 MockK 类。记住:测试依赖必须用 testImplementation,否则运行时不会加载。
第三步:理解各个依赖的作用
我把依赖分成三组,用表格列出来,你一看就清楚。
| 依赖坐标 | 作用 | 版本 |
|---|---|---|
| io.mockk:mockk | MockK 核心 mock 库 | 1.13.10 |
| org.junit.jupiter:junit-jupiter-api | JUnit5 编程接口(注解、断言等) | 5.10.2 |
| org.junit.jupiter:junit-jupiter-engine | JUnit5 测试引擎(运行时) | 5.10.2 |
| org.junit.jupiter:junit-jupiter-params | 参数化测试支持(可选) | 5.10.2 |
版本号我推荐用当前最新的稳定版。但注意 MockK 和 Kotlin 版本有兼容性要求:你用的 Kotlin 1.9.x 就配 MockK 1.13.x。我之前遇到过 MockK 1.12 和 Kotlin 1.8 一起用没问题,升到 Kotlin 1.9 后直接编译报错,查了半天才发现是版本不匹配。
第四步:同步依赖 & 编写第一个测试
配置好 build.gradle.kts 后,点击 IDE 里的“刷新 Gradle”按钮,或者终端执行 ./gradlew build,等待依赖下载完成。
然后创建一个测试类,我们验证一下环境是否正常。比如这样:
import io.mockk.every
import io.mockk.mockk
import org.junit.jupiter.api.Test
class FirstMockTest {
private val mockService = mockk<MyService>()
@Test
fun `should mock a simple method`() {
every { mockService.greet("World") } returns "Hello, World!"
val result = mockService.greet("World")
assert(result == "Hello, World!")
}
}
interface MyService {
fun greet(name: String): String
}
运行测试,绿色通过就说明环境搭好了。我曾经遇到过 mockk 类找不到的情况,一查是 build.gradle.kts 里漏了 tasks.test { useJUnitPlatform() },加上就 OK 了。
避坑指南(都是我的血泪史)
- 不要在 plugins 块里写重复的 kotlin 插件。 我试过同时写 kotlin("jvm") 和 kotlin("kapt") 没声明注解处理,导致 build 失败。
- 确保 JDK 版本 >= 11。 MockK 1.13 需要 JDK 11,我用 JDK 8 折腾了半天才发现。
- Gradle 配置文件编码问题。 如果中文注释出现乱码,在 build.gradle.kts 里加一行
tasks.withType<JavaCompile> { options.encoding = "UTF-8" }。 - JUnit5 如果跑不起来,检查一下 build.gradle.kts 有没有配置 test 任务使用 JUnit 平台。 这步特别容易忘。
💡 小技巧: 我习惯把 MockK 和 JUnit5 的版本号提取到 gradle.properties 文件中,方便统一升级。比如:mockkVersion=1.13.10,然后在 build.gradle.kts 里用 ${property("mockkVersion")} 引用。
验证环境的小实验
你还可以写一个更复杂的测试,同时验证 MockK 和 JUnit5 的交互:
import io.mockk.every
import io.mockk.mockk
import io.mockk.verify
import org.junit.jupiter.api.Test
class CollaborationTest {
@Test
fun `verify that method was called exactly once`() {
val mock = mockk<Calculator>()
every { mock.add(1, 2) } returns 3
val actual = mock.add(1, 2)
verify(exactly = 1) { mock.add(1, 2) }
assert(actual == 3)
}
}
interface Calculator {
fun add(a: Int, b: Int): Int
}
如果你能看到测试通过,那恭喜——你的 MockK + JUnit5 环境就稳了。
嗯,其实我想说的是,环境搭建这一步虽然枯燥,但值得仔细走一遍。很多问题都是出在版本不一致或者配置遗漏上。你按照我上面的流程走,应该一路绿灯。要是有报错,回头看看 build.gradle.kts 里的每一个单词,我保证你能找到原因。