2016-03-05 35 views
7

में @ClassRule का उपयोग करें JUnit में आप एक स्थिर क्षेत्र को एनोटेट करने के लिए @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 object बनाने के बजाय companion नामक ऑब्जेक्ट (कक्षा का एकल उदाहरण) घोषित कर रहे हैं। और इसलिए स्थैतिक क्षेत्र सही ढंग से नहीं बनाए जाते हैं।

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

दोनों हालांकि मान्य कोड हैं:

class TestClass { 
    companion object { ... } 
} 

बहुत अलग से है।

यहाँ @ClassRule उपयोग करने का एक सही काम कर रहे उदाहरण के लिए, 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...") 
    } 
} 

यह आउटपुट:

ClassRule पहले


परीक्षण ...
ClassRule

के बाद
+0

ओह, मेरे हिस्से पर बेवकूफ नौसिखिया त्रुटि। धन्यवाद :) – lujop

+1

'ऑब्जेक्ट साथी {...} 'ऑब्जेक्ट एक्सप्रेशन नहीं है लेकिन https://kotlinlang.org/docs/reference/object-declarations.html के अनुसार ऑब्जेक्ट घोषणा है। –