2017-08-10 61 views
3

我試圖在每次測試之前找到設置變量的方法。就像Junit中的@Before方法一樣。通過kotlin-test的文檔,我發現我可以使用interceptTestCase()接口。但不幸的是,下面的代碼會引發異常:如何在每次測試之前使用kotlin-test框架初始化變量

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

您還沒有初始化text變量。 當你爲一個類創建一個對象時,首先調用init。

您在代碼中調用text shouldEqual "ABC"中的init塊,那時text變量中將沒有值。

您的功能interceptTestCase(context: TestCaseContext, test:() -> Unit)只能在init塊之後調用。

在構造函數本身初始化文本就像下面的代碼一樣,所以你不會得到這個錯誤或做出一些選擇。

class KotlinTest(private val text: String): StringSpec() 
+0

其實這不是理由。 'text shouldEqual「ABC」'不在'init'塊中調用,lambda包含'text shouldEqual「ABC」'只在那裏創建,不能運行。 – michalbrz

1

一個快速的解決方案是添加以下語句測試用例:
override val oneInstancePerTest = false

的根本原因是oneInstancePerTest是真的在默認情況下(儘管它在科特林測試文檔假),這意味着每一個測試方案將在不同的實例中運行。

在有問題的情況下, 的初始化interceptTestCase方法,例如一個跑,設置文本ABC。然後測試用例在B的情況下運行,沒有interceptTestCase

更多細節,還有一個懸而未決的問題在GitHub上:
https://github.com/kotlintest/kotlintest/issues/174

相關問題