第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 的默认参数,更简洁
我的小建议: 如果你的团队全是 Kotlin 圈子,直接上 kotlin.test。如果项目兼有 Java 和 Kotlin 代码,我更推荐在 Gradle 里把两个依赖都打上,Java 测试沿用 JUnit5,Kotlin 测试用 kotlin.test——互不干扰。

2.2 它跟 JUnit5 究竟是怎么协作的?

你来看我画的这张关系图,看完就一目了然了:

kotlin.test 与 JUnit5 协作关系 kotlin.test (Kotlin API) 断言函数 (assert等) 注解 (@Test等) JUnit Platform Gradle 依赖配置 kotlin.test 调用 JUnit5 引擎 Gradle 统一管理依赖

从图上你能看到: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 才是背后的锁芯。把依赖配好,钥匙才能插进去转动。下一小节我们会动手写第一个测试,到时就更能体会到这种配合的丝滑感了。