kotlintest如何测试spring启动应用

How does kotlintest test spring boot application

Spring 引导应用程序的集成测试始终首先启动 Web 服务器。

最简单的 spring 启动测试如下所示,如何使用 kotlintest 迁移它?

@ExtendWith(SpringExtension::class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
class ReportApplicationTests {

    @Test
    fun `Server can be launched`() {
    }

}

我是这样设置的:首先,确保引用 JUnit 5 而不是 4,例如我在 build.gradle:

dependencies 部分找到了这个
testImplementation "org.springframework.boot:spring-boot-starter-test:${springBootVersion}"
testImplementation "org.jetbrains.kotlin:kotlin-test"
testImplementation "org.jetbrains.kotlin:kotlin-test-junit"
testImplementation "io.kotlintest:kotlintest-extensions-spring:3.1.10"
testImplementation 'io.kotlintest:kotlintest-runner-junit5:3.1.10'
testImplementation "org.junit.jupiter:junit-jupiter-api:5.3.1"
testImplementation "org.junit.jupiter:junit-jupiter-engine:5.3.1"

也将此添加到 build.gradle:

test {
    useJUnitPlatform()
}

然后在你的集成测试中 class 有这个(注意 listeners 的覆盖,没有它就不会工作):

import org.springframework.boot.test.context.SpringBootTest
import io.kotlintest.spring.SpringListener

@SpringBootTest(
        webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,
        classes = [MyApplication::class])
class MyTestStringSpec : StringSpec() {
    override fun listeners() = listOf(SpringListener)

    init {
        // Tests go in here
    }
}

显然,您可以将 StringSpec 替换为任何其他 Kotlin 测试 testing styles,例如FunSpecShouldSpec

更新:从 4.3+ 版本开始,有一些变化。

版本 4.3+(更新)

KotlinTest 已重命名为 Kotest。 SpringExtension 是与 spring 集成的 class。 The documentation使用方法很简单。

除了Kotest依赖,还应该加上SpringExtension:

testImplementation("io.kotest.extensions:kotest-extensions-spring:1.0.0")

然后将 SpringExtension 添加到您的扩展中。从那时起,您可以在测试中使用 Spring Boot 提供的所有内容,例如 ContextConfiguration 和其他:

@SpringBootTest
class MyTestSpec : FunSpec() {
   override fun extensions() = listOf(SpringExtension)

   init {
     test("I'm inside a Spring context!") { }
   }
}

版本 3.3.2(很旧)

Kotlintest very nice guide 关于如何设置 Spring 扩展以测试 Spring 框架。

基本上,除了 KotlinTest 依赖,你还要添加它的 Spring Extension:

testImplementation ("io.kotlintest:kotlintest-runner-junit5:3.3.2") // KT dependency
testImplementation("io.kotlintest:kotlintest-extensions-spring:3.3.2") // KT Spring Extensions

然后将 SpringListener SpringBootTest 添加到您的代码中:

import org.springframework.boot.test.context.SpringBootTest
import io.kotlintest.spring.SpringListener

@SpringBootTest
class SpringExample : FreeSpec() {

    override fun listeners() = listOf(SpringListener)

    init {
        "Verify context loads" {

        }
    }
}

您不需要为您创建的每个测试添加 SpringListener,您可以使用 ProjectConfig 全局配置它。 KotlinTest Documentation

中解释了 ProjectConfig