2012-05-29 14 views
68

जबकि एक नया jUnit4 परीक्षा लिखना, मैं सोच रहा हूँ कि क्या @RunWith (MockitoJUnitRunner.class) या MockitoAnnotations.initMocks (यह) उपयोग करने के लिए।@RunWith (MockitoJUnitRunner.class) बनाम MockitoAnnotations.initMocks (यह)

मैंने एक नया परीक्षण & बनाया है विज़ार्ड स्वचालित रूप से रनर के साथ एक परीक्षण उत्पन्न करता है। MockitoJUnitRunner राज्य के लिए Javadocs निम्नलिखित:

JUnit 4.4 और उच्चतर के साथ संगत, इस धावक व्यवहार निम्नलिखित जोड़ता है:

initializes, नकली के साथ एनोटेट का मजाक उड़ाता है ताकि MockitoAnnotations.initMocks (वस्तु) की स्पष्ट उपयोग आवश्यक नहीं है । प्रत्येक टेस्ट विधि से पहले मोक्स शुरू किए जाते हैं। प्रत्येक परीक्षण विधि के बाद ढांचे के उपयोग को मान्य करता है।

यह धावक का उपयोग कर initMocks पर कोई फायदा है कि क्या() विधि मैंने पहले भी उपयोग किया गया है मेरे लिए स्पष्ट नहीं है।

किसी भी विचार या लिंक की सराहना की जाएगी!

उत्तर

85

MockitoJUnitRunner आपको फ्रेमवर्क उपयोग के स्वचालित सत्यापन के साथ-साथ एक स्वचालित initMocks() देता है।

फ्रेमवर्क उपयोग की स्वत: सत्यापन वास्तव में लायक है। यदि आप इन गलतियों में से एक बनाते हैं तो यह आपको बेहतर रिपोर्टिंग देता है।

  • आप स्थिर when विधि कॉल, लेकिन एक मिलान thenReturn, thenThrow या then साथ छोटा करते पूरा नहीं करते हैं। (नीचे दिए गए कोड में त्रुटि 1)

  • आप एक नकली पर verify फोन है, लेकिन विधि कॉल है कि आप को सत्यापित करने के प्रयास कर रहे हैं प्रदान करने के लिए भूल जाते हैं। (नीचे दिए गए कोड में त्रुटि 2)

  • आप doReturn, doThrow या doAnswer के बाद when विधि कॉल और एक नकली गुजरती हैं, लेकिन विधि है कि आप ठूंठ की कोशिश कर रहे प्रदान करने के लिए भूल जाते हैं। (नीचे दिए गए कोड में त्रुटि 3)

आप ढांचे उपयोग के सत्यापन की जरूरत नहीं है, तो इन गलतियों को एक Mockito विधि के लिए निम्नलिखित कॉल जब तक रिपोर्ट नहीं दी जाती।यह

    ही परीक्षण विधि (नीचे त्रुटि 1 की तरह) में
  • ,
  • अगले परीक्षा पद्धति (नीचे त्रुटि 2 की तरह) में
  • ,
  • अगले परीक्षण कक्षा में
  • हो सकता है।

यदि वे आपके द्वारा चलाए गए अंतिम परीक्षण (जैसे नीचे त्रुटि 3) में होते हैं, तो उन्हें बिल्कुल रिपोर्ट नहीं की जाएगी।

यहां बताया गया है कि इनमें से प्रत्येक प्रकार की त्रुटियां कैसे दिखाई दे सकती हैं। यहां मान लें कि जुनीट इन परीक्षणों को यहां सूचीबद्ध क्रम में चलाता है।

@Test 
public void test1() { 

    // ERROR 1 
    // This compiles and runs, but it's an invalid use of the framework because 
    // Mockito is still waiting to find out what it should do when myMethod is called. 
    // But Mockito can't report it yet, because the call to thenReturn might 
    // be yet to happen. 
    when(myMock.method1()); 

    doSomeTestingStuff(); 

    // ERROR 1 is reported on the following line, even though it's not the line with 
    // the error. 
    verify(myMock).method2(); 

} 

@Test 
public void test2() { 

    doSomeTestingStuff(); 

    // ERROR 2 
    // This compiles and runs, but it's an invalid use of the framework because 
    // Mockito doesn't know what method call to verify. But Mockito can't report 
    // it yet, because the call to the method that's being verified might 
    // be yet to happen. 
    verify(myMock); 
} 

@Test 
public void test3() { 

    // ERROR 2 is reported on the following line, even though it's not even in 
    // the same test as the error. 
    doReturn("Hello").when(myMock).method1(); 


    // ERROR 3 
    // This compiles and runs, but it's an invalid use of the framework because 
    // Mockito doesn't know what method call is being stubbed. But Mockito can't 
    // report it yet, because the call to the method that's being stubbed might 
    // be yet to happen. 

    doReturn("World").when(myMock); 

    doSomeTestingStuff(); 

    // ERROR 3 is never reported, because there are no more Mockito calls. 
} 

अब जब मैं पहली बार एक से अधिक पांच साल पहले इस जवाब लिखा, मैं

लिखा था तो मैं MockitoJUnitRunner जहां भी संभव हो के उपयोग की सिफारिश करेंगे। हालांकि, जैसा कि टॉमसज़ नर्कविचज़ ने सही ढंग से बताया है, यदि आप स्प्रिंग वन जैसे किसी अन्य जुनीट धावक की ज़रूरत है तो आप इसका उपयोग नहीं कर सकते।

मेरी सिफारिश अब बदल गई है। मॉकिटो टीम ने एक नई सुविधा जोड़ दी है क्योंकि मैंने पहली बार यह जवाब लिखा था। यह एक जुनीट नियम है, जो MockitoJUnitRunner के समान कार्य करता है। लेकिन यह बेहतर है, क्योंकि यह अन्य धावकों के उपयोग को रोकता नहीं है।

अपने परीक्षण कक्षा में

@Rule 
public MockitoRule rule = MockitoJUnit.rule(); 

शामिल करें। यह मोक्स शुरू करता है, और फ्रेमवर्क सत्यापन स्वचालित करता है; बस MockitoJUnitRunner करता है। लेकिन अब, आप SpringJUnit4ClassRunner या किसी अन्य JUnitRunner का भी उपयोग कर सकते हैं। मॉकिटो 2.1.0 के बाद, अतिरिक्त विकल्प हैं जो वास्तव में नियंत्रित करते हैं कि किस तरह की समस्याएं रिपोर्ट की जाती हैं।

+3

इस पर अधिक जानकारी के लिए [Mockito.validateMockitoUsage() '] के लिए javadocs देखें (http://docs.mockito.googlecode.com/hg/latest/org/mockito/Mockito.html#validateMockitoUsage%28%29) मान्यता। – avandeursen

+0

मैं निश्चित रूप से यह नहीं कह सकता कि वे वही हैं। एक टेस्ट केस में, जूनिट रनर सेटअप मेरे लिए विफल रहता है और जब तक मैं initMocks सेटअप – dtc

+0

करता हूं तो हम अपने मैक्स को ठीक से इंजेक्ट नहीं करते हैं। हम testng 6.8.8 + mockito 1.10.19 का उपयोग कर रहे हैं और जाहिर है, हम MockitoJUnitRunner का उपयोग नहीं कर सकते हैं, लेकिन सत्यापन ढांचे अभी भी काम करता है! और यह बिल्कुल @ डेविड वालेस के रूप में काम करता है। क्या कोई समझा सकता है? क्या ऐसा इसलिए है क्योंकि हमारे पास अभी भी @ कॉलबैक और MockitoAnnotations.initMocks (यह) है? – yuranos87

23

धावक का उपयोग करके आप कोडिंग का थोड़ा सा बचा सकते हैं (@Before विधि की आवश्यकता नहीं है)। दूसरी ओर एक रनर का उपयोग करना कभी-कभी संभव नहीं होता है, यानी जब आप पहले से ही एक का उपयोग कर रहे हैं, जैसे SpringJUnit4ClassRunner

यही है। यह सिर्फ वरीयता का मामला है।

+1

initMocks() लाइन के अलावा, @ किसी भी अन्य सेटअप के लिए @ पहले विधि की आवश्यकता होगी, है ना? – OceanBlue

+1

@OceanBlue: बेशक अगर आपके '@ पहले' विधि में 'initMocks()' को छोड़कर कुछ भी शामिल है, तो आपको धावक के लिए माइग्रेट करने के बाद इसे संरक्षित करना होगा। –

+0

ढांचे के सत्यापन के बारे में डेविड वालेस का जवाब मेरे प्रश्न का पूरी तरह उत्तर देता है इसलिए मैंने इसे स्वीकार कर लिया है, लेकिन यह इंगित करने के लिए +1 कि इस धावक को स्प्रिंग वन की तरह किसी अन्य के साथ उपयोग नहीं किया जा सकता है। धन्यवाद! – OceanBlue

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

  • कोई संबंधित समस्या नहीं^_^