我正试图在每次测试之前找到一种设置变量的方法。就像Junit中的@Before方法一样。通过kotlin-test的doc,我发现我可以使用interceptTestCase()接口。但不幸的是,下面的代码会触发异常:
kotlin.UninitializedPropertyAccessException: lateinit property text has not been initialized
class KotlinTest: StringSpec() {
lateinit var text:String
init {
"I hope variable is be initialized before each test" {
text shouldEqual "ABC"
}
"I hope variable is be initialized before each test 2" {
text shouldEqual "ABC"
}
}
override fun interceptTestCase(context: TestCaseContext, test: () -> Unit) {
println("interceptTestCase()")
this.text = "ABC"
test()
}
}
我是否以错误的方式使用interceptTestCase()? 非常感谢〜
答案 0 :(得分:2)
快速解决方案是在测试用例中添加以下语句:
override val oneInstancePerTest = false
根本原因是默认情况下oneInstancePerTest为true(尽管在kotlin test doc中为false),这意味着每个测试场景都将在不同的实例中运行。
在有问题的情况下,
初始化interceptTestCase
方法在实例 A 中运行,将 text 设置为 ABC 。然后测试用例在实例 B 中运行而没有interceptTestCase
。
有关详细信息,GitHub中有一个未解决的问题:
https://github.com/kotlintest/kotlintest/issues/174
答案 1 :(得分:0)
您尚未初始化text
变量。
在为类创建对象时,init首先调用。
您在代码的text shouldEqual "ABC"
块中调用init
,那时text
变量中没有任何值。
只能在interceptTestCase(context: TestCaseContext, test: () -> Unit)
阻止后调用您的函数init
。
在构造函数本身初始化文本,如下面的代码,所以你不会得到这个错误或做出一些替代。
class KotlinTest(private val text: String): StringSpec()