2015-02-24 8 views
5

के साथ कोटलिन का उपयोग करना मुझे कोटलिन के साथ jmockit का उपयोग करके कुछ सलाह चाहिए।jmockit

(कट) इस परीक्षा के तहत मेरे (जावा) वर्ग है:

public final class NutritionalConsultant { 
    public static boolean isLunchTime() { 
     int hour = LocalDateTime.now().getHour(); 
     return hour >= 12 && hour <= 14; 
    } 
} 

(j.1) यह एक काम कर जावा परीक्षण वर्ग है

@RunWith(JMockit.class) 
public class NutritionalConsultantTest { 
    @Test 
    public void shouldReturnTrueFor12h(@Mocked final LocalDateTime dateTime) { 
     new Expectations() {{ 
      LocalDateTime.now(); result = dateTime; 
      dateTime.getHour(); result = 12; 
     }}; 
     boolean isLunchTime = NutritionalConsultant.isLunchTime(); 
     assertThat(isLunchTime, is(true)); 
    } 
} 

(kt.1) हालांकि, इसी kotlin वर्ग एक अपवाद फेंकता

RunWith(javaClass<JMockit>()) 
public class NutritionalConsultantKt1Test { 

    Test 
    public fun shouldReturnTrueFor12h(Mocked dateTime : LocalDateTime) { 
     object : Expectations() {{ 
      LocalDateTime.now(); result = dateTime; 
      dateTime.getHour(); result = 12; 
     }} 
     val isLunchTime = NutritionalConsultant.isLunchTime() 
     assertThat(isLunchTime, eq(true)); 
    } 
} 

अपवाद:

+०१२३५१६४१०६
java.lang.Exception: Method shouldReturnTrueFor12h should have no parameters 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:408) 
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:41) 
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:212) 
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:68) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140) 

ग्रेडल के साथ चलाने पर एक ही अपवाद फेंक दिया जाता है।

(kt.2) kotlin मैं एक अलग अपवाद हो रही है साथ @Mocked वाक्य रचना का उपयोग करना:

RunWith(javaClass<JMockit>()) 
public class NutritionalConsultantKt2Test { 
    Mocked 
    var dateTime : LocalDateTime by Delegates.notNull() 

    Test 
    public fun shouldReturnTrueFor12h() { 
     object : Expectations() {{ 
      LocalDateTime.now(); result = dateTime; 
      dateTime.getHour(); result = 12; 
     }} 
     val isLunchTime = NutritionalConsultant.isLunchTime() 
     assertThat(isLunchTime, eq(true)); 
    } 
} 

अपवाद:

java.lang.IllegalArgumentException: Final mock field "dateTime$delegate" must be of a class type 
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:74) 
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:212) 
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:68) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140) 

संपादित 20,150,224 शायद इस से संबंधित है "के लिए एक नकली क्षेत्र, घोषित प्रकार का एक उदाहरण स्वचालित रूप से जेमॉकिट द्वारा बनाया जाएगा और क्षेत्र को सौंपा जाएगा, बशर्ते यह अंतिम नहीं है। " (http://jmockit.org/tutorial/BehaviorBasedTesting.html से)

(kt.3) हालांकि, वैल को var में बदलकर और !! ऑपरेटर एक काम कर परीक्षण की ओर जाता है ... लेकिन इस मुहावरेदार kotlin कोड नहीं है:

RunWith(javaClass<JMockit>()) 
public class NutritionalConsultantKt3Test { 
    Mocked 
    var dateTime : LocalDateTime? = null 

    Test 
    public fun shouldReturnTrueFor12h() { 
     object : Expectations() {{ 
      LocalDateTime.now(); result = dateTime; 
      dateTime!!.getHour(); result = 12; 
     }} 
     val isLunchTime = NutritionalConsultant.isLunchTime() 
     assertThat(isLunchTime, eq(true)); 
    } 
} 

आप और अधिक सफलता JMockit साथ kotlin का उपयोग कर किया है?

उत्तर

0

मुझे नहीं लगता कि आप कोटलिन (या अन्य अन्य जेवीएम वैकल्पिक भाषाओं, ग्रोवी के संभावित अपवाद के साथ) से जेमॉकिट का उपयोग करने में सक्षम होंगे, भरोसेमंद नहीं।

कारण हैं कि 1) जेमॉकिट ऐसी भाषाओं के साथ विकसित नहीं किया गया था, और उनके साथ परीक्षण नहीं किया गया है; और 2) इन भाषाओं, बाइटकोड में संकलित होने पर, अतिरिक्त या अलग संरचनाएं उत्पन्न करती हैं जो जेमॉकिट जैसे टूल को भ्रमित कर सकती हैं; वे आमतौर पर अपने आंतरिक एपीआई में कॉल डालते हैं जो रास्ते में भी हो सकते हैं।

प्रैक्टिस में, वैकल्पिक भाषाएं अपना स्वयं का परीक्षण/मॉकिंग/आदि विकसित करती हैं। उपकरण, जो न केवल उस भाषा और उसके रनटाइम के लिए अच्छी तरह से काम करते हैं, बल्कि आपको भाषा की कठिनाइयों का पूर्ण लाभ भी देते हैं।

व्यक्तिगत रूप से, भले ही मैं ऐसी भाषाओं को लाता हूं (और मुझे विशेष रूप से कोटलिन पसंद है), मैं जावा के साथ चिपकना चाहता हूं (जो विकसित होता है - जावा 8 देखें)। तथ्य यह है कि अब तक नहीं वैकल्पिक जेवीएम भाषा जावा के व्यापक उपयोग के करीब आ गई है, और (आईएमओ) वे कभी नहीं करेंगे।

+0

> मैं जावा के साथ चिपकना चाहता हूं (जो विकसित होता जा रहा है - जावा 8 देखें) बस यह ध्यान रखना चाहते हैं कि यह एंड्रॉइड पर सच नहीं है। –

+0

@ जेसन मॉनार्ड रोजरियो jmockit – Novaterata

0

हम एक छोटे से प्रयोग किया और पाया है कि आप इस तरह विशेष समारोह को परिभाषित कर सकते है:

fun uninitialized<T>() = null as T 

और उसके बाद इस तरह इसका इस्तेमाल:

[Mocked] val dateTime : LocalDateTime = uninitialized() 

आप भी इसे बजाय Matchers.any() उपयोग कर सकते हैं एक ही प्रभाव के लिए। हम इसे कंपाइलर या मानक पुस्तकालय में जोड़ने पर विचार करेंगे।

+0

के लेखक हैं एनोटेशन के लिए वाक्यविन्यास बदल गया है, उपर्युक्त उदाहरण में '[मॉक]] अब' @ मॉक 'होगा –

संबंधित मुद्दे