मॉकिंग बनाम मॉकिंग फ्रेमवर्क में जासूसी


131

चौखटे मजाक में, आप कर सकते हैं नकली एक वस्तु या जासूसी उस पर। दोनों के बीच क्या अंतर है और मुझे एक दूसरे पर कब और क्या उपयोग करना चाहिए?

उदाहरण के लिए, मॉकिटो को देखते हुए , मुझे जासूसों और मॉक का उपयोग करते हुए समान चीजें दिखाई देती हैं , लेकिन मैं दोनों के बीच अंतर के रूप में अनिश्चित हूं।



के संभावित डुप्लिकेट stackoverflow.com/questions/28295625/mockito-spy-vs-mock
अभिनव

जवाबों:


157

नकली वस्तु पूरी तरह से नकली वर्ग की जगह लेती है, जो रिकॉर्डेड या डिफॉल्ट वैल्यू देता है। आप "पतली हवा" से नकली बना सकते हैं। यह वही है जो ज्यादातर यूनिट परीक्षण के दौरान उपयोग किया जाता है।

जासूसी करते समय, आप एक मौजूदा ऑब्जेक्ट लेते हैं और केवल कुछ विधियों को "प्रतिस्थापित" करते हैं। यह तब उपयोगी होता है जब आपके पास एक विशाल वर्ग होता है और केवल कुछ विधियों (आंशिक मजाक) का मजाक उड़ाना चाहता है। मुझे मॉकिटो प्रलेखन उद्धृत करें :

आप वास्तविक वस्तुओं के जासूस बना सकते हैं। जब आप जासूस का उपयोग करते हैं तब वास्तविक तरीकों को बुलाया जाता है (जब तक कि एक विधि को ठूंसा नहीं गया)।

वास्तविक जासूसों को सावधानीपूर्वक और कभी-कभी इस्तेमाल किया जाना चाहिए , उदाहरण के लिए जब विरासत कोड के साथ काम करते हैं।

जब संदेह हो, तो मॉक का उपयोग करें।


1
धन्यवाद! यह बहुत स्पष्ट करता है। इसलिए नकली को कभी वास्तविक वस्तु के रूप में प्रस्तुत नहीं किया जाता है , लेकिन जासूस करते हैं।
विविन पालीथ

7
मोक्स में "वास्तविक वस्तु" नहीं है - नकली को initio बनाया जाता है।
कार्ल मैनस्टर

4
हर समय जासूसों का उपयोग करने के खिलाफ मॉकिटो क्यों चेतावनी देता है, इसके लिए कोई स्पष्टीकरण? मैं देख रहा हूं कि वे मॉक के पक्ष में कहते हैं, लेकिन मैं इस वजह से स्पष्ट नहीं हूं।
मैट

9
मुझे यकीन नहीं है, लेकिन शायद इसलिए कि वे "मॉकिटो" हैं और "स्पाईटिटो" नहीं: डी
टाइपोप्रोप

16

मॉकिटो चेतावनी देता है कि आंशिक मज़ाक करना एक अच्छा अभ्यास नहीं है और आपको अपनी ऑब्जेक्ट ओरिएंटेड वास्तुकला को संशोधित करना चाहिए। विरासत कोड का परीक्षण करने के लिए जासूस (या आंशिक मजाक) की सिफारिश की जाती है ।


16

मैं यहाँ एक उदाहरण का उपयोग करके समझाने की कोशिश करूँगा:

// Difference between mocking, stubbing and spying
@Test
public void differenceBetweenMockingSpyingAndStubbing() {
    List list = new ArrayList();
    list.add("abc");
    assertEquals(1, list.size());

    List mockedList = spy(list);
    when(mockedList.size()).thenReturn(10);
    assertEquals(10, mockedList.size());
}

यहां, हमारे पास प्रारंभिक वास्तविक वस्तु थी list, जिसमें हमने एक तत्व और अपेक्षित आकार को एक जोड़ा।

हम वास्तविक वस्तु की जासूसी करते हैं जिसका अर्थ है कि हम निर्देश दे सकते हैं कि किस विधि को ठूंसा जाए । इसलिए हमने घोषणा की कि हमने जासूसी वस्तुsize() पर हमला किया है - जो कि 10 पर वापस आ जाएगी, चाहे वास्तविक आकार कोई भी हो।

संक्षेप में, आप होगा जासूसी वास्तविक वस्तु और ठूंठ तरीकों के कुछ


2

संदर्भ: http://javapointers.com/tutorial/difference-between-spy-and-mock-in-ockock/

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

जबकि जासूसी वस्तुओं में, ज़ाहिर है, चूंकि यह एक वास्तविक तरीका है, जब आप विधि को नहीं रोक रहे हैं, तो यह वास्तविक विधि व्यवहार कहलाएगा। यदि आप विधि को बदलना और मॉक करना चाहते हैं, तो आपको इसे स्टब करने की आवश्यकता है।


2

डमी वस्तुओं को पास किया जाता है लेकिन वास्तव में कभी भी उपयोग नहीं किया जाता है। आमतौर पर वे बस पैरामीटर सूचियों को भरने के लिए उपयोग किए जाते हैं।

नकली वस्तुओं में वास्तव में काम करने वाले कार्यान्वयन होते हैं, लेकिन आमतौर पर कुछ शॉर्टकट लेते हैं जो उन्हें उत्पादन के लिए उपयुक्त नहीं बनाता है (स्मृति डेटाबेस में एक अच्छा उदाहरण है)।

स्टब्स परीक्षण के दौरान किए गए कॉलों के लिए डिब्बाबंद उत्तर प्रदान करते हैं, आमतौर पर परीक्षण के लिए प्रोग्राम किए गए बाहर के किसी भी चीज़ का जवाब नहीं देते हैं।

जासूस स्टब्स होते हैं जो कुछ जानकारियों को रिकॉर्ड करते हैं कि उन्हें कैसे बुलाया गया था। इसका एक रूप एक ईमेल सेवा हो सकती है जो यह बताती है कि कितने संदेश भेजे गए थे।

मोक्स वे हैं जिनके बारे में हम यहां बात कर रहे हैं: ऑब्जेक्ट्स पूर्व-अपेक्षाओं के साथ प्रोग्राम किए जाते हैं जो उन कॉलों का एक विनिर्देश बनाते हैं जो उन्हें प्राप्त होने की उम्मीद है।

मार्टिन फॉवलर द्वारा मोक्स स्टब्स नहीं हैं


1

जासूसों की दो परिभाषाएँ होती हैं। एक, जहां वास्तविक विधि कहा जाता है, एक और जहां, कोई कार्यक्षमता नहीं कहलाती है और केवल शून्य या शून्य समतुल्य मान लौटाए जाते हैं, लेकिन विधियों को बुलाया गया था, और वे राज्य दर्ज किए गए थे, आमतौर पर, विधि x को y बार कहा जाता था।


0

मॉकिटो में यदि आप मॉक ऑब्जेक्ट के इंस्टेंस वेरिएबल को कोई ऑब्जेक्ट असाइन करते हैं तो मॉक ऑब्जेक्ट पर कोई प्रभाव नहीं पड़ता है।

लेकिन स्पाई के मामले में, यदि आप किसी ऑब्जेक्ट को स्पाई ऑब्जेक्ट के वेरिएबल के लिए असाइन करते हैं, तो स्पाई ऑब्जेक्ट पर असर पड़ता है क्योंकि यह स्पाई एक्ट की तरह होता है।

एक संदर्भ के लिए उदाहरण हैं

@RunWith(MockitoJUnitRunner.class)
public class MockSpyExampleTest {

    @Mock
    private List<String> mockList;

    @Spy
    private List<String> spyList = new ArrayList();

    @Test
    public void testMockList() {
        //by default, calling the methods of mock object will do nothing
        mockList.add("test");
        assertNull(mockList.get(0));
    }

    @Test
    public void testSpyList() {
        //spy object will call the real method when not stub
        spyList.add("test");
        assertEquals("test", spyList.get(0));
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.