如何在每次测试之前使用kotlin-test框架初始化变量

时间:2017-08-10 16:20:32

标签: kotlin kotlintest

我正试图在每次测试之前找到一种设置变量的方法。就像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()? 非常感谢〜

2 个答案:

答案 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()