第2章:Kotlin测试框架初探——kotlin.test与JUnit5的关系,如何配置Gradle依赖
说实话,刚接触 Kotlin 测试的人,十有八九会问:我到底该用 kotlin.test 还是 JUnit5?它们俩是什么关系?
我的答案是——它们不是二选一,而是 上下层协作。kotlin.test 是 Kotlin 官方提供的测试 API 封装,而 JUnit5 是底层的测试引擎。没有 JUnit5,kotlin.test 就跑不起来;但只靠 JUnit5,你又享受不到 Kotlin 的简洁语法和 DSL 便利。
我当年第一次在 Kotlin 项目里写测试时,直接照搬 Java 的 JUnit4 写法,结果 IDE 报了一堆类型推断错误。后来才发现,kotlin.test 才是 Kotlin 项目该有的“打开方式”。
2.1 kotlin.test 是什么?
说白了,kotlin.test 就是 JetBrains 官方为 Kotlin 量身打造的测试库。它提供了一套 Kotlin 风格的断言函数和注解,让我们写测试时不用再忍受 Java 的冗长。
你可以把它看作 JUnit5 的“Kotlin 皮肤”——底层还是跑在 JUnit5 的引擎上,但调用方式更自然。
| 特性 | JUnit5(Java风格) | kotlin.test(Kotlin风格) |
|---|---|---|
| 断言 | assertEquals(1, result) | assertEquals(result, 1) 或 assert(1 == result) |
| 测试类 | @Test public void foo() | @Test fun foo() |
| 空安全检测 | 无内建支持 | assertNotNull 直接集成 Kotlin 类型 |
| 依赖注入 | 需要额外配置 | 借用了 Kotlin 的默认参数,更简洁 |
2.2 它跟 JUnit5 究竟是怎么协作的?
你来看我画的这张关系图,看完就一目了然了:
从图上你能看到:kotlin.test 站在最上层提供 API,下层依赖 JUnit5 的 Platform 和 引擎 来实际执行。而所有这些,又都靠 Gradle 的依赖配置串联起来。
2.3 怎样配置 Gradle 依赖?
我记得刚开始自己配的时候,因为依赖版本没对齐,测试跑出来全是 No tests found,气得差点砸键盘。后来才摸清楚:要把 kotlin.test 和 JUnit5 的引擎都加进来,而且版本号必须匹配。
下面是我踩过坑后整理的标准配置,你直接复制到 build.gradle.kts 里就好:
dependencies {
// Kotlin 测试核心库(包含 kotlin.test)
testImplementation("org.jetbrains.kotlin:kotlin-test:1.9.22")
// JUnit5 平台引擎(运行测试必须)
testImplementation("org.junit.jupiter:junit-jupiter-api:5.10.2")
testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.10.2")
// 如果想用 JUnit4 的注解或兼容旧代码,再加 vintage
// testRuntimeOnly("org.junit.vintage:junit-vintage-engine:5.10.2")
}
// 记得配置这个任务,不然 IDEA 会找不到测试
tasks.test {
useJUnitPlatform()
}
kotlin-test-junit5 这个 artifact(旧版写法),注意它只包含 JUnit5 的集成桥,不包含 JUnit5 的核心引擎。我就曾只依赖了 kotlin-test-junit5 却漏了 junit-jupiter-engine,结果跑测试时一直报“No tests found”。加上 testRuntimeOnly 后问题就解决了。
2.4 实际项目中怎么选?
给你列个决策简表,遇到新项目时可以直接对号入座:
| 项目类型 | 推荐配置 | 理由 |
|---|---|---|
| 纯 Kotlin 项目 | kotlin-test + junit-jupiter-engine | 最轻量,断言语感最好 |
| 混合 Java/Kotlin 项目 | 上述 + Java 测试另加 junit-jupiter-api | 互不影响,Java 测试用 JUnit5 原生,Kotlin 测试用 kotlin.test |
| 旧项目从 JUnit4 迁移 | 额外加上 vintage-engine | 临时兼容老测试,逐步替换 |
核心要点总结:
- kotlin.test 是 Kotlin 的测试 API,不是独立运行框架
- 底层必须依赖 JUnit Platform 和对应的引擎(Jupiter 或 Vintage)
- Gradle 里
useJUnitPlatform()这个任务配置是很多人会忘的——我也忘过
嗯,看到这里你应该已经明白了:kotlin.test 像是一把 Kotlin 专属的钥匙,JUnit5 才是背后的锁芯。把依赖配好,钥匙才能插进去转动。下一小节我们会动手写第一个测试,到时就更能体会到这种配合的丝滑感了。