# 使用 Maven 测试 Kotlin 项目
Kotlin 能够与 Maven 生态系统无缝集成, 让你使用业界标准的工具来验证你的后端应用程序. 这篇指南介绍如何使用 JUnit 创建测试, 以及使用 Maven plugin 运行单元测试和集成测试.
> **Tip:**
> 关于设置 Maven 项目并使用 Kotlin 和 Java 的详细指南, 请参见 [项目配置](mixing-java-kotlin-intellij.html#project-configuration).
## 使用 JUnit 创建测试
[JUnit](https://junit.org/) 是 Kotlin 后端开发的标准测试框架. Kotlin 支持多个 JUnit 版本, 但大多数现代项目应该使用 JUnit 6.
要使用 JUnit 在 Kotlin 中创建测试, 请使用来自 `kotlin.test` 或 JUnit 包的 `@Test` 注解.
### 添加依赖项
最简单的方式是使用 `kotlin-test` 库. 它提供一套通用的断言函数, 并自动引入需要的 JUnit artifact.
#### JUnit 5 及更高版本
对于所有新项目, 请使用 `kotlin-test-junit5` artifact. 它提供对 JUnit 的完整支持, 包括嵌套测试和并行执行等功能. Kotlin/JVM 支持 JUnit 的最新稳定版本, JUnit 6.
按如下方式更新你的 `pom.xml` 文件:
```XML
org.jetbrains.kotlin
kotlin-test-junit5
2.4.20
test
```
> **Note:**
> 尽管名称是 junit5, 但 `kotlin-test-junit5` 支持所有最新的 JUnit 版本, 包括 JUnit 6.
#### JUnit 4
如果你希望使用旧版本的 JUnit, 例如用于旧的项目, 请使用基于 JUnit 4 的 `kotlin-test-junit` artifact:
```XML
org.jetbrains.kotlin
kotlin-test-junit
2.4.20
test
```
> **Tip:**
> 关于使用 JUnit 进行测试的详细指南和示例项目, 请参见 [使用 Kotlin 测试 Java 代码](jvm-test-using-junit.html) 教程.
### 编写单元测试(Unit Test)
单元测试(Unit Test)用于验证代码中独立的部分, 例如单独的函数或类. 按照惯例, 单元测试的命名使用 `*Test` 后缀. 例如:
```KOTLIN
import kotlin.test.Test
import kotlin.test.assertEquals
class OrderServiceTest {
@Test
fun `calculate total should sum item prices`() {
val service = OrderService()
val result = service.calculateTotal(listOf(10.0, 25.0))
assertEquals(35.0, result)
}
}
```
### 编写集成测试(Integration Test)
集成测试(Integration Test)用于验证组件之间的交互, 例如服务与数据库之间的交互. 按照惯例, 集成测试的命名使用 `*IT` 后缀. 例如:
```KOTLIN
import kotlin.test.Test
import kotlin.test.assertNotNull
class UserRepositoryIT {
@Test
fun saveFindUser() {
// 示例: 与数据库或服务集成
val repository = UserRepository()
repository.save(User("KotlinUser"))
val user = repository.findByName("KotlinUser")
assertNotNull(user)
}
}
```
## 运行测试
在 Maven 项目中, 测试执行通常由两个 plugin 共同负责: Surefire 和 Failsafe, 以确保构建生命周期清晰有序.
### 使用 Surefire plugin
[Surefire plugin](https://maven.apache.org/surefire/maven-surefire-plugin/) 负责处理 单元测试(Unit Test). 它运行所有符合 `*Test` 命名规范的 Kotlin 和 Java 测试.
默认情况下, 它在构建生命周期的 `test` 阶段执行, 如果测试失败则立即中止构建.
```XML
org.apache.maven.plugins
maven-surefire-plugin
3.5.5
```
要只运行单元测试, 请使用以下命令:
```BASH
mvn test
```
### 使用 Failsafe plugin
[Failsafe plugin](https://maven.apache.org/surefire/maven-failsafe-plugin/) 负责处理 集成测试(Integration Test). 它运行所有符合 `*IT` 命名规范的 Kotlin 和 Java 测试.
与 Surefire 不同, Failsafe 允许构建在 `integration-test` 阶段的测试失败后继续执行, 使得 `post-integration-test` 阶段的任务(例如停止 Docker 容器)能够运行. 如果存在测试失败, 构建最终会在 `verify` 阶段报告失败.
```XML
org.apache.maven.plugins
maven-failsafe-plugin
3.5.5
integration-test
verify
```
要同时运行单元测试和集成测试, 请使用以下命令:
```BASH
mvn verify
```
## 探索其他测试框架
除了 JUnit 之外, 还可以使用其他流行的框架, 让 Kotlin 测试代码更加符合惯用法, 更加易读:
| 库 | 说明 |
| --- | --- |
| [AssertJ](https://github.com/assertj/assertj) | 支持链式调用的流式断言库. |
| [Mockito-Kotlin](https://github.com/mockito/mockito-kotlin) | Mockito 的 Kotlin 封装库, 提供辅助函数, 与 Kotlin 类型系统更好地集成. |
| [MockK](https://github.com/mockk/mockk) | 原生的 Kotlin mock 库, 支持 Kotlin 的特有功能, 包括协程和扩展函数. |
| [Kotest](https://github.com/kotest/kotest) | 面向 Kotlin 的断言库, 提供多种断言风格和丰富的匹配器支持. |
| [Strikt](https://github.com/robfletcher/strikt) | 面向 Kotlin 的断言库, 提供类型安全的断言以及对数据类的支持. |
## 下一步做什么?
* 探索 [kotlin.test 库](https://kotlinlang.org/api/latest/kotlin.test/kotlin.test/) 的功能.
* 使用 [Kotlin 的 Power-assert 编译器 plugin](power-assert.html), 改善测试的输出.