【问题标题】:How does kotlintest test spring boot applicationkotlintest如何测试spring boot应用
【发布时间】:2018-11-13 08:47:25
【问题描述】:

Spring boot 应用的集成测试总是先启动web服务器。

spring boot test 最简单的测试如下图,如何改用kotlintest迁移呢?

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

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

}

【问题讨论】:

    标签: spring-boot kotlin kotlintest


    【解决方案1】:

    更新:从 4.3+ 版本开始,有些地方发生了变化。

    版本 4.3+(更新)

    KotlinTest 已重命名为 Kotest。 SpringExtension 是与 spring 集成的类。 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 Extension 以测试 Spring Framework。

    基本上,除了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 对其进行全局配置。 ProjectConfig 在KotlinTest Documentation中解释了

    【讨论】:

    • 最近监听器被重命名:“在 Kotest 4.3 和更早的版本中,Spring 扩展被称为 SpringListener。这个扩展现在已经被弃用,取而代之的是 SpringExtension。用法是一样的,但是 SpringExtension 有更多的功能. " 见kotest.io/docs/extensions/spring.html#testcontexts
    • 完美,@OliverEisenbarth。我会更新答案
    【解决方案2】:

    我是这样设置的:首先,确保引用 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()
    }
    

    然后在您的集成测试类中有这个(注意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,例如FunSpec、ShouldSpec等

    【讨论】:

    • 它对我不起作用。您能否分享一个示例项目来演示它?
    • 抱歉,我错过了一步:您需要覆盖 listeners 并返回 SpringListener。已更新我的答案。如果你仍然卡住,请告诉我,我会在 github 上贴一个示例 repo。
    • @YoniGibbs 我认为您不需要那么多依赖项。我只使用testImplementation "org.springframework.boot:spring-boot-starter-test:${springBootVersion}"、testImplementation 'io.kotlintest:kotlintest-runner-junit5:3.1.10' 和testImplementation "io.kotlintest:kotlintest-extensions-spring:3.1.10" 进行设置
    • 很高兴知道。谢谢@Kerooker。
    猜你喜欢
    • 1970-01-01
    • 2017-09-03
    • 2019-01-21
    • 1970-01-01
    • 2018-09-13
    • 2018-04-27
    • 2018-03-20
    • 2021-05-27
    • 2016-11-06
    相关资源
    最近更新 更多