junit 如何使用SpringBootTest避免kotest中的初始化错误?

vvppvyoh  于 2022-11-11  发布在  Spring
关注(0)|答案(1)|浏览(217)

我有一个简单的JUnit“smoke”测试,用于检查Spring上下文是否正确加载:

@SpringBootTest
class ContextLoadJUnit {

    @Test
    fun contextLoads() {
        //empty by design
    }
}

我试着把它重写成kotest。我已经测试了两个版本:

@SpringBootTest
@ApplyExtension(SpringTestExtension::class)
class ContextLoadKotestWordSpec : WordSpec({
  "context" should { "load with WordSpec" {} }
})

@SpringBootTest
class ContextLoadKotestFunSpec : FunSpec() {

    override fun extensions(): List<Extension> {
        return listOf(SpringExtension)
    }
    init {
        test("context should load with FunSpec") {}
    }
}

我在一个文件中包含所有三个测试:

import io.kotest.core.extensions.ApplyExtension
import io.kotest.core.extensions.Extension
import io.kotest.core.spec.style.FunSpec
import io.kotest.core.spec.style.WordSpec
import io.kotest.extensions.spring.SpringExtension
import io.kotest.extensions.spring.SpringTestExtension
import org.junit.jupiter.api.Test
import org.springframework.boot.test.context.SpringBootTest

@SpringBootTest
class ContextLoadJUnit {

    @Test
    fun contextLoads() {
        //empty by design
    }
}

@SpringBootTest
@ApplyExtension(SpringTestExtension::class)
class ContextLoadKotestWordSpec : WordSpec({
  "context" should { "load with WordSpec" {} }
})

@SpringBootTest
class ContextLoadKotestFunSpec : FunSpec() {

    override fun extensions(): List<Extension> {
        return listOf(SpringExtension)
    }
    init {
        test("context should load with FunSpec") {}
    }
}

当它们正在运行和通过时,它们被正确地处理:

但是当它们失败时,kotest被“ Package ”到initializationError中,看起来我只有两个测试:

有没有办法以不同的方式准备kotest,避免initializationError,并看到我有三个单独的失败测试?

bsxbgnwa

bsxbgnwa1#

Kotest的SpringExtensionSpringTestExtension的一个示例,它是一个SpecExtension和一个TestCaseExtension
应用程序上下文的初始化发生在扩展的SpecExtension部分的intercept函数中。当应用程序上下文的初始化失败时,规范从未被执行,因此,规范的单个测试从未被初始化。这具有IntelliJ不显示任何失败的测试的效果--简单地说,没有失败的测试,只有失败的规范。
我们可以通过只取SpringExtension的初始化逻辑的一部分并将其放在如下测试中来绕过该行为:

import io.kotest.core.spec.style.FunSpec
import org.springframework.test.context.TestContextManager

class KotestWithSpring : FunSpec() {
    init {
        val testContextManager = TestContextManager(this::class.java)
        test("context should load") {
            testContextManager.beforeTestClass()
            testContextManager.prepareTestInstance(this)
        }
    }
}

当此测试类的应用程序上下文失败时,它将如下所示:

相关问题