环境搭建:Kotlin/Gradle项目配置、依赖引入

好,咱们正式开始动手。这一章我带你搭一个干净利落的 Kotlin + Gradle 项目,把 MockK 和 JUnit5 的依赖一股脑儿配好。别小看这一步——我当年踩过的坑,一半都是因为环境没理清。

说实话,很多教程让你直接复制粘贴一段配置就完事,结果跑起来报错根本不知道哪的问题。我习惯先理清整体流程,再动手写代码。你跟着我的节奏来,十五分钟就能搭好。

整体流程先过一遍

环境搭建说白了就四步:创建项目 → 配置 Gradle 脚本 → 添加依赖 → 验证可运行。我画了个流程图,你一眼就能看明白。

环境搭建核心流程 1. 创建 Kotlin 项目 2. 配置 build.gradle.kts 3. 添加 MockK + JUnit5 依赖 4. 同步 Gradle / 下载依赖 5. 编写测试用例 → 运行验证 💡 避坑提示 依赖版本号要统一 Kotlin 与 MockK 版本 需匹配 关键配置项 kotlin("jvm") testImplementation mockk junit-jupiter

第一步:创建 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 里的每一个单词,我保证你能找到原因。