5

我试图找到一种在每次测试之前设置变量的方法。就像 Junit 中的 @Before 方法一样。通过kotlin-test的文档,我发现我可以使用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()?非常感谢~

4

2 回答 2

2

一个快速的解决方案是在测试用例中添加以下语句:
override val oneInstancePerTest = false

根本原因是 oneInstancePerTest 默认为 true(尽管在 kotlin 测试文档中为 false),这意味着每个测试场景都将在不同的实例中运行。

在有问题的情况下,初始化interceptTestCase方法在实例A中运行,将text设置为ABC。然后测试用例没有interceptTestCase.

有关更多详细信息,GitHub 中有一个未解决的问题:
https ://github.com/kotlintest/kotlintest/issues/174

于 2017-08-21T15:33:37.390 回答
0

您尚未初始化text变量。为类创建对象时首先调用 init。

text shouldEqual "ABC"您在代码中调用init块,那时text变量中将没有值。

您的函数interceptTestCase(context: TestCaseContext, test: () -> Unit)只能在init块之后调用。

像下面的代码一样在构造函数本身初始化文本,所以你不会得到这个错误或做出一些替代。

class KotlinTest(private val text: String): StringSpec()
于 2017-08-10T16:38:49.773 回答