2016-03-05 17 views
7

In JUnit è possibile utilizzare @ClassRule per annotare un campo statico. Come posso fare questo in Kotlin?Utilizzare @ClassRule in Kotlin

ho provato:

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

and 

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

ma nessuna delle ultime opere, perché regola non viene eseguita.

Ho ricontrollato che esattamente stessa regola funziona bene senza contesto statico:

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

quale differenza tra le prime due versioni? – IRus

+0

Uno usa @JvmStatic e altri JvmField. Per capire come voglio riprodurre un campo statico, il primo è quello da usare, ma ho provato anche con il secondo. – lujop

risposta

9

Non si sta utilizzando companion objects correttamente. Stai dichiarando un oggetto (singola istanza di una classe) chiamato companion invece di creare uno companion object all'interno di una classe. E quindi i campi statici non sono creati correttamente.

class TestClass { 
    companion object { ... } 
} 

è molto diverso:

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

Anche se entrambi sono codice valido.

Ecco un esempio corretto funzionamento del usando @ClassRule, testato 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...") 
    } 
} 

This uscite:

ClassRule Prima
Testing ...
ClassRule Dopo

+0

Oh, stupido errore newbie da parte mia. Grazie :) – lujop

+1

'object companion {...}' non è un'espressione dell'oggetto ma una dichiarazione oggetto come per https://kotlinlang.org/docs/reference/object-declarations.html. –