2016-03-05 12 views
7

JUnitでは@ClassRuleを使用して静的フィールドに注釈を付けることができます。 Kotlinでこれを行うにはどうしたらいいですか?Kotlinで@ClassRuleを使用する

私が試した:

object companion { 
    @ClassRule @JvmStatic 
    val managedMongoDb = ...  
} 

and 

object companion { 
    @ClassRule @JvmField 
    val managedMongoDb = ...  
} 

が、最後の作品のどれもルールが実行されていないため。

私は正確に同じルールが静的コンテキストなしで正常に動作することを確認ダブルルーム:

@Rule @JvmField 
val managedMongoDb = ... 
+0

最初の2つのバージョンの違いは何ですか? – IRus

+0

@JvmStaticと他のJvmFieldを使います。私が静的なフィールドを再現したいと思うように私が理解するには、最初に使用するフィールドがありますが、2番目のフィールドでも試みました。 – lujop

答えて

9

あなたは正しくcompanion objectsを使用していません。クラスの内部にcompanion objectを作成する代わりに、companionというオブジェクト(クラスの単一インスタンス)を宣言しています。したがって、静的フィールドは正しく作成されません。

class TestClass { 
    companion object { ... } 
} 

よりも非常に異なっている:両方が有効なコードですが

class TestClass { 
    object companion { ... } // this is an object declaration, not a companion object 
} 

。ここで

はKotlin 1.0.0でテストし、@ClassRuleを使用しての正しい実施例である:

class TestWithRule { 
    companion object { 
     @ClassRule @JvmField 
     val resource: ExternalResource = object : ExternalResource() { 
      override fun before() { 
       println("ClassRule Before") 
      } 

      override fun after() { 
       println("ClassRule After") 
      } 
     } 
    } 

    @Test fun testSomething() { 
     println("Testing...") 
    } 
} 

この出力は:

ClassRule
テスト...


ClassRule前に
+0

ああ、愚かな初心者の誤りです。ありがとう:) – lujop

+1

'オブジェクトコンパニオン{...}'は、オブジェクト式ではなく、https://kotlinlang.org/docs/reference/object-declarations.htmlのオブジェクト宣言です。 –

関連する問題