2017-08-26 7 views
2

共通のセットアップを共有するいくつかのテストケースがあります。それらはすべて同じように初期化できる2つのフィールドが必要です。だから私はlateinit varフィールドにそれらを抽出し、テストケースのインターセプタでそれらを作成できると思った。
しかし、テストケースでアクセスしようとすると、初期化されていないため、常に例外がスローされます。
すべてのテストケースの前にフィールドを作成する方法はありますか? Kotlintestインターセプタとlateinit vars

はここで、これまでに私のコードです:

class ElasticsearchFieldImplTest : WordSpec() { 

    // These 2 are needed for every test 
    lateinit var mockDocument: ElasticsearchDocument 
    lateinit var mockProperty: KProperty<*> 

    override fun interceptTestCase(context: TestCaseContext, test:() -> Unit) { 
     // Before Each 
     mockDocument = mock() 
     mockProperty = mock { 
      on {name} doReturn Gen.string().generate() 
     } 

     // Execute Test 
     test() 

     // After Each 
    } 

    init { 
     "ElasticsearchFields" should { 
      "behave like normal var properties" { 
       val target = ElasticsearchFieldImpl<Any>() 
       // Here the exception is thrown 
       target.getValue(mockDocument, mockProperty) shouldBe null 

       val testValue = Gen.string().generate() 
       target.setValue(mockDocument, mockProperty, testValue) 
       target.getValue(mockDocument, mockProperty) shouldBe testValue 
      } 
     } 
    } 
} 

私は、デバッガでそれをステップ実行し、私はそれはテストの前に実行されていること、およびプロパティが初期化されていることがわかりinterceptTestCaseメソッドにブレークポイントを設定します。それから私はテストに進み、そのプロパティはもはや初期化されません。

答えて

1

КлаусШварцの答えが間違っています。これはkotlintestが動作する方法ではありません。initラムダのみ作成され、実行されません。したがって、ブロックのlateinit varにアクセスしていません。彼らは決していかなる価値も割り当てられません。これはkotlintestにバグのために動作しません

、ここで説明した(実際にはほとんど解決さ):要するにhttps://github.com/kotlintest/kotlintest/issues/174

を - interceptTestCaseは、実際のテストよりもクラスの別のインスタンスで呼び出されます。だからあなたのテストには何の影響もありません。

回避策プロパティをオーバーライドすることです: override val oneInstancePerTest = false

するとそこに正しく唯一のインスタンスとinterceptTestCase作品があるが、あなたは覚えている - すべてのテストためのインスタンスが1つしかありません。

Kotlintest 3.0はこのバグから解放されます。 (しかし、デフォルトではすべてのテストに対して1つのインスタンスが存在する可能性があります)

0

初期化する前にlateinit varsにアクセスしないでください。

問題は、デフォルトのコンストラクタであるブロック内のlateinit varにアクセスしていて、interceptTestCase()の前に呼び出されていることです。

最も簡単な方法は、mockDocumentmockPropertyをnullにすることです。

var mockDocument: ElasticsearchDocument? = null 
var mockProperty: KProperty<*>? = null 

としたい場合は、これらのフィールドは!!修飾子を追加する初期化されていなかった場合クラッシュするテスト:

init { 
    "ElasticsearchFields" should { 
     "behave like normal var properties" { 
      val target = ElasticsearchFieldImpl<Any>() 
      // Here the exception is thrown 
      target.getValue(mockDocument!!, mockProperty!!) shouldBe null 

      val testValue = Gen.string().generate() 
      target.setValue(mockDocument!!, mockProperty!!, testValue) 
      target.getValue(mockDocument!!, mockProperty!!) shouldBe testValue 
     } 
    } 
} 
関連する問題