2013-02-26 82 views
7

मेरे पास एक टेस्ट क्लास (टेस्टएनजी पर आधारित) है जहां मैं एक जासूस ऑब्जेक्ट के लिए Mockito.verify का उपयोग करता हूं।मॉकिटो जासूस रीसेट करना

यह काम करता है:

public class Program { 
    @Spy 
    private TestObject testObject; 

    @Test 
    public void test1() { 
     testObject.makeSth(); 
     verify(testObject, only()).someMethodNeedToBeChecked(); 
    } 
} 

लेकिन यहाँ:

public class Program { 
    @Spy 
    private TestObject testObject; 

    @Test 
    public void test1() { 
     testObject.makeSth(); 
     verify(testObject, only()).someMethodNeedToBeChecked(); 
    } 

    @Test 
    public void test2() { 
     // Some different scenario 
     testObject.makeSth(); 
     verify(testObject, only()).someMethodNeedToBeChecked(); 
     ... 
    } 
} 

मैं एक Mokito अपवाद है कि मैं someMethodNeedToBeChecked विधि से एक मंगलाचरण अधिक है कि राशि मिलता है। बेशक मैंने Mockito.reset(testObject) जोड़ने की कोशिश की लेकिन इससे मेरी मदद नहीं हुई।

यदि मुझे कई परीक्षणों में एक ही विधि को सत्यापित करने की आवश्यकता है तो मैं एक जासूसी वस्तु को कैसे रीसेट कर सकता हूं?

+0

मैं http://programmers.stackexchange.com/questions/188299/is-this-an- पर पर एक समान प्रश्न पूछा उचित उपयोग के- mockitos रीसेट-विधि। बस एफवाईआई, हालांकि एक नकली से संबंधित एक जासूस नहीं है। –

+0

आपने 'रीसेट' पर कॉल जोड़ने का प्रयास किया था? शायद अपना प्रयास दिखाने के लिए अपना कोड संपादित करें, लेकिन टिप्पणी की? –

+0

मैंने केवल प्रोटोटाइप उदाहरण संलग्न किया है, रीसेट करने के लिए मैंने @BeforeMethod \ @BeforeClass में, @After के साथ, सत्यापन से पहले भी करने की कोशिश की - यह काम नहीं किया। जैसा कि मैं समझता हूं कि यह एक मुद्दा है केवल जासूसों और रीसेट के साथ नकली वस्तुओं के लिए है। –

उत्तर

12

Mockito documentation से: क्योंकि वे इसे गरीब परीक्षण का संकेत हो सकता है पता

रीसेट किया जा रहा mocks (1.8.0 के बाद से)

स्मार्ट Mockito उपयोगकर्ताओं शायद ही इस सुविधा का उपयोग। आम तौर पर, आपको अपने मोजे को रीसेट करने की आवश्यकता नहीं है, बस प्रत्येक परीक्षण विधि के लिए नए मोजे बनाएं। रीसेट करने के बजाय() कृपया लंबे, अधिक निर्दिष्ट परीक्षणों पर सरल, छोटे और केंद्रित परीक्षण विधियों को लिखने पर विचार करें। परीक्षण विधि के बीच में पहली संभावित कोड गंध रीसेट() है। इसका शायद मतलब है कि आप बहुत अधिक परीक्षण कर रहे हैं। अपने परीक्षण विधियों के फुसफुसाहट का पालन करें: "कृपया हमें छोटे व्यवहार पर ध्यान दें &"। मॉकिटो मेलिंग सूची पर इसके बारे में कई धागे हैं।

रीसेट() विधि को जोड़ने का एकमात्र कारण यह है कि कंटेनर इंजेक्शन वाले मैक्स के साथ काम करना संभव हो।

आप शायद सिर्फ एक @BeforeMethod में जासूस पुन: बनाने चाहिए:

public class Program { 

    private TestObject testObject = new TestObject(); 
    private TestObject spyTestObject; 

    @BeforeMethod 
    public void buildSpy() { 
     spyTestObject = spy(testObject); 
    } 

    @Test 
    public void test1() { 
     spyTestObject.makeSth(); 
     verify(spyTestObject , only()).someMethodNeedToBeChecked(); 
    } 

    @Test 
    public void test2() { 
     // Some different scenario 
     spyTestObject.makeSth(); 
     verify(spyTestObject , only()).someMethodNeedToBeChecked(); 
     ... 
    } 
} 
+0

मुझे समझ में नहीं आता कि आप क्यों कह रहे हैं कि प्रत्येक परीक्षण को अब दो आमंत्रणों की अपेक्षा करने की आवश्यकता होगी। जासूस प्रत्येक टेस्ट विधि से पहले पुनर्निर्माण किया जाता है। –

+0

क्षमा करें, मैंने आपके उत्तर को गलत तरीके से पढ़ा है :-) –

+0

धन्यवाद, असल में यह मेरी मदद करता है, लेकिन यदि आप @ इंजेक्शनमोक्स और अन्य लोगों जैसे एनोटेशन का उपयोग करते हैं तो आपको वहां इतनी सुंदरता दिखाई देने वाले इनिटॉक्स को कॉल करने की भी आवश्यकता है। –