2016-03-05 9 views
7

In JUnit können Sie mit @ClassRule ein statisches Feld annotieren. Wie kann ich das in Kotlin machen?Verwenden Sie @ClassRule in Kotlin

Ich habe versucht:

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

and 

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

aber keines der letzten Werke, weil Regel nicht ausgeführt wird.

ich doppelt geprüft, dass genau die gleiche Regel ohne statischen Kontext funktioniert gut:

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

Was ist der Unterschied zwischen den ersten beiden Versionen? – IRus

+0

Man verwendet @JvmStatic und andere JvmField. Zu meinem Verständnis, wie ich ein statisches Feld reproduzieren möchte, ist das erste zu verwenden, aber ich habe es auch mit dem zweiten versucht. – lujop

Antwort

9

Sie sind nicht companion objects funktionieren nicht richtig. Sie deklarieren ein Objekt (einzelne Instanz einer Klasse) mit dem Namen companion anstelle eines companion object innerhalb einer Klasse. Und deshalb werden die statischen Felder nicht korrekt erstellt.

class TestClass { 
    companion object { ... } 
} 

ist ganz anders als:

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

Obwohl beide gültigen Code sind.

ist hier ein richtig funktionierendes Beispiel @ClassRule verwenden, getestet in Kotlin 1.0.0:

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...") 
    } 
} 

Diese Ausgänge:

ClassRule Vor
Testing ...
ClassRule Nach

+0

Oh, dummer Newbie Fehler meinerseits. Danke :) – lujop

+1

'Objektbegleiter {...}' ist kein Objektausdruck, sondern eine Objektdeklaration gemäß https://kotlinlang.org/docs/reference/object-declarations.html. –