java एक ही कक्षा में नकली तरीकों




unit-testing mocking (3)

मैं एक ही कक्षा में एक विधि का नकली करने के लिए मोकीटो का उपयोग कर रहा हूं जिसके लिए मैं परीक्षण लिख रहा हूं। मैंने इतने सारे उत्तर ( एक ही कक्षा में विधि का मजाक ) पर देखा है, लेकिन शायद मैं उन्हें गलत समझ रहा हूं, क्योंकि मैं मुद्दों में चल रहा हूं।

 class Temp() {

    public boolean methodA(String param) {

         try {

             if(methodB(param))
                   return true;

             return false;
         } catch (Exception e) {
               e.printStackTrace();
         }
    }
 }

मेरी परीक्षा विधि:

 @Test
 public void testMethodA() {

    Temp temp = new Temp();
    Temp spyTemp = Mockito.spy(temp);

    Mockito.doReturn(true).when(spyTemp).methodB(Mockito.any()); 
    boolean status = temp.methodA("XYZ");

    Assert.assertEquals(true, status);
 }

मुझे हालांकि एक्सपेक्शन का प्रिंट आउट मिलता है क्योंकि methodB की परिभाषा निष्पादित हो जाती है। मेरी समझ methodB की परिभाषा है spyTemp का उपयोग करके मजाक उड़ाया जाएगा। हालांकि यह मामला नहीं दिखाई देता है।

क्या कोई कृपया समझा सकता है कि मैं गलत कहां जा रहा हूं?


पहला मुद्दा यह है कि आपको मोकीटो से कुछ उम्मीद करने के लिए spyTest ऑब्जेक्ट का उपयोग करना होगा यहां यह परीक्षण के समान नहीं है। spyTemp एक Mockito वस्तु temp द्वारा लिपटे है

एक और मुद्दा यह है कि आप केवल methodB() , लेकिन methodA() को चलाने का प्रयास करते हैं methodA() । हां, methodA() आपके कार्यान्वयन में आप methodB () कहते हैं, लेकिन आप इस पर कॉल करते हैं। this.methodB() , नहीं spyTemp.methodB() । यहां आपको यह समझना होगा कि मजाक तो तभी काम करेगा जब आप इसे temp । यह मॉकिटो प्रॉक्सी द्वारा लपेटा हुआ है जो आपकी कॉल को पकड़ता है और अगर आपने कुछ विधि को ओवरराइड कर दिया है तो यह मूल के बजाय आपके नए कार्यान्वयन को फोन करेगा। लेकिन जब से मूल विधि कहा जाता है, इसके अंदर आप मॉकिटो प्रॉक्सी के बारे में कुछ नहीं जानते इसलिए आपके "ओवरराइड" पद्धति को केवल तभी बुलाया जाएगा जब आप spyTemp.methodB() चलाते हैं

यह काम करना चाहिए:

Mockito.doReturn(true).when(spyTemp).methodB(Mockito.any()); 
boolean status = spyTemp.methodB("XYZ");

आपने एक जासूस बनाया और methodB() वह सही है! लेकिन आप मूल वस्तु पर methodA() कहा जाता है। सही परिणाम प्राप्त करने के लिए इसे जासूसी पर कॉल करें

boolean status = spyTemp.methodA("XYZ");

Mockito दस्तावेज़ीकरण से निम्न नोट करें:

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

यह आपकी स्थिति के लिए विशेष रूप से संदर्भित है। आप temp को संदर्भित करते हैं और फिर अपनी methodA कॉल करते हैं methodA Mockito बिल्कुल उस घटना पर जासूसी नहीं कर रहा है; यह spyTemp पर जासूसी है इसलिए सामान्य methodB को कहा जाता है।

ध्यान दें कि आपको आंशिक रूप से नए कोड के लिए नकल से बचना चाहिए।







mockito