2017-08-10 5 views
3

各テストの前に変数を設定する方法を見つけようとしています。 Junitの@Beforeメソッドと似ています。 kotlin-testのドキュメントを見て、interceptTestCase()インターフェイスを使用できることが判明しました。kotlin-test frameworkを使用して各テストの前に変数を初期化する方法

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が最初に呼び出されました。

initブロックに呼び出しています。このとき、text変数には値はありません。

interceptTestCase(context: TestCaseContext, test:() -> Unit)の機能は、initブロックの後に呼び出すことができます。

以下のコードのようにコンストラクタ自体のテキストを初期化してください。このエラーは発生しません。

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

実はこれが理由ではありません。 'text shouldEqual" ABC "は' init'ブロックでは呼び出されず、 'shouldEqual" ABC "を含むラムダはそこに作成され、実行されません。 – michalbrz

1

迅速な解決をテストケースに文の下に追加することです:
override val oneInstancePerTest = false

根本的な原因は、すべてのテストを意味し、(それがkotlinテストdocに偽のですが)oneInstancePerTestは、デフォルトでtrueであるということですシナリオは異なるインスタンスで実行されます。問題の場合

、 初期化interceptTestCase方法は、例えばに走っABCテキストを設定します。その場合、テストケースはにはinterceptTestCaseを含まずに実行されました。詳細については

は、GitHubの中に未解決の問題があります:
https://github.com/kotlintest/kotlintest/issues/174

関連する問題