2016-03-05 74 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

前兩個版本有什麼區別? – IRus

+0

一個使用@JvmStatic和其他JvmField。據我的理解,我想重現一個靜態字段,第一個是使用的字段,但我也嘗試了第二個字段。 – lujop

回答

9

您沒有使用正確companion objects。您正在聲明一個名爲companion的對象(類的單個實例),而不是在類中創建companion object。因此,靜態字段不能正確創建。

class TestClass { 
    companion object { ... } 
} 

有很大的不同比:

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

雖然兩者都是有效的代碼。

下面是使用@ClassRule的正確工作的例子,在科特林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...") 
    } 
} 

此輸出:

ClassRule之前
測試...
ClassRule後

+0

哦,我這個笨蛋新手錯誤。謝謝:) – lujop

+1

'object companion {...}'不是一個對象表達式,而是一個按照https://kotlinlang.org/docs/reference/object-declarations.html的對象聲明。 –