如何通过interceptTestCase改变KotlinTest中的测试对象属性

时间:2017-07-13 12:47:05

标签: kotlin kotlintest

我正在尝试使用 interceptTestCase 方法在KotlinTest中为测试用例设置属性,如下所示:

class MyTest : ShouldSpec() {
    private val items = mutableListOf<String>()
    private var thing = 123

    override fun interceptTestCase(context: TestCaseContext, test: () -> Unit) {
        items.add("foo")
        thing = 456
        println("Before test ${items.size} and ${thing}")
        test()
        println("After test ${items.size} and ${thing}")
    }

    init {
        should("not work like this") {
            println("During test ${items.size} and ${thing}")
        }
    }
}

我得到的输出是:

  

在测试1和456之前

     

在测试0和123期间

     

在测试1和456之后

因此,我所做的更改在测试用例中不可见。在每次测试执行之前我应该​​如何更改属性?

1 个答案:

答案 0 :(得分:3)

您应该通过TestCaseContext访问当前规范。每个测试都有其分隔的Spec,例如:

override fun interceptTestCase(context: TestCaseContext, test: () -> Unit) {
    //                v--- casting down to the special Spec here.
    with(context.spec as MyTest) {
    //^--- using with function to take the `receiver` in lambda body

        items.add("foo") // --
                         //   |<--- update the context.spec properties
        thing = 456      // --

        println("Before test ${items.size} and ${thing}")
        test()
        println("After test ${items.size} and ${thing}")
    }
}