परीक्षण में निपुणता: JUnit, Mockito और एकीकरण परीक्षण · पाठ

वास्तविक ऑब्जेक्ट पर जासूसी

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

पाठ 3, कुल 4 में से11 चरण

वास्तविक ऑब्जेक्ट पर जासूसी, CoddyKit पर परीक्षण में निपुणता: JUnit, Mockito और एकीकरण परीक्षण का एक निःशुल्क पाठ है। यह 4 में से 3वाँ पाठ है। इस अध्ययन पथ के 3 तक कोई भी पाठ पूरा पढ़ना निःशुल्क है — इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ व्यावहारिक अभ्यास भी उपलब्ध कराता है। यह परीक्षण में निपुणता: JUnit, Mockito और एकीकरण परीक्षण सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। परीक्षण में निपुणता: JUnit, Mockito और एकीकरण परीक्षण पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

Mockito स्पाइज़ क्या हैं

Mockito में आपने ऑब्जेक्ट के व्यवहार पर पूरा नियंत्रण रखने के लिए मॉक बनाना सीखा है। लेकिन यदि आप अन्य विधियों का मूल व्यवहार बनाए रखते हुए केवल कुछ विधियों को बदलना चाहें, तो क्या होगा?

यहीं स्पाइज़ उपयोगी होते हैं! स्पाई एक वास्तविक ऑब्जेक्ट को रैप करता है और आपको ये सुविधाएँ देता है:

  • डिफ़ॉल्ट रूप से ऑब्जेक्ट की वास्तविक विधियों को कॉल करना।
  • विशिष्ट विधियों को ओवरराइड (स्टब) करके पूर्वनिर्धारित मान लौटाना।
  • वास्तविक ऑब्जेक्ट के साथ हुए इंटरैक्शन का सत्यापन करना।

इसे 'आंशिक मॉकिंग' की तरह समझें—वास्तविक ऑब्जेक्ट का उपयोग, लेकिन कुछ बदलावों के साथ।

अपना पहला स्पाई बनाना

स्पाई बनाना सरल है। Mockito.mock() के बजाय आप Mockito.spy() का उपयोग करते हैं और उस वास्तविक ऑब्जेक्ट का इंस्टेंस पास करते हैं जिस पर आप स्पाई करना चाहते हैं।

आइए एक सरल DataService class परिभाषित करें, जिसका उपयोग हम अपने उदाहरणों में करेंगे। यह सेवा कुछ ऑपरेशन करेगी।

import org.mockito.Mockito;

public class DataService {
    public String fetchData(String id) {
        return "Real data for " + id;
    }

    public int processData(String data) {
        return data.length();
    }
}

public class Main {
    public static void main(String[] args) {
        DataService realService = new DataService();
        DataService spyService = Mockito.spy(realService);

        System.out.println("Spy created successfully!");
    }
}

स्पाइज़ वास्तविक विधियों को कॉल करते हैं

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

आइए देखें कि हमारा spyService वास्तविक विधि को कैसे कॉल करता है:

import org.mockito.Mockito;

public class DataService {
    public String fetchData(String id) {
        System.out.println("--- Calling REAL fetchData for ID: " + id + " ---");
        return "Real data for " + id;
    }

    public int processData(String data) {
        return data.length();
    }
}

public class Main {
    public static void main(String[] args) {
        DataService realService = new DataService();
        DataService spyService = Mockito.spy(realService);

        String result = spyService.fetchData("123");
        System.out.println("Result from spy: " + result);

        int processed = spyService.processData("Hello");
        System.out.println("Processed data length: " + processed);
    }
}

स्पाई की स्टबिंग: व्यवहार ओवरराइड करना

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

हालांकि, स्पाई की स्टबिंग करते समय doReturn().when() सिंटैक्स का उपयोग करना अक्सर अधिक सुरक्षित होता है:

  • Mockito.when(spy.method()).thenReturn(value) में when() वाले भाग के दौरान कॉल किए जाने पर वास्तविक विधि पहले चल सकती है।
  • Mockito.doReturn(value).when(spy).method() स्टबिंग के दौरान वास्तविक विधि को कॉल होने से रोकता है। यह तब महत्वपूर्ण है जब वास्तविक विधि के दुष्प्रभाव हों या वह अपवाद उत्पन्न करती हो।

स्पाई की स्टबिंग का प्रयोग

आइए अपने spyService की fetchData विधि को स्टब करें, ताकि वह किसी विशिष्ट ID के लिए कस्टम मान लौटाए, जबकि अन्य कॉल वास्तविक विधि तक जाती रहें:

import org.mockito.Mockito;

public class DataService {
    public String fetchData(String id) {
        System.out.println("--- Calling REAL fetchData for ID: " + id + " ---");
        return "Real data for " + id;
    }

    public int processData(String data) {
        return data.length();
    }
}

public class Main {
    public static void main(String[] args) {
        DataService realService = new DataService();
        DataService spyService = Mockito.spy(realService);

        // Stubbing the spy for a specific input
        Mockito.doReturn("Mocked data for specific ID")
               .when(spyService)
               .fetchData("specialId");

        // This call will return the mocked data
        String result1 = spyService.fetchData("specialId");
        System.out.println("Result for specialId: " + result1);

        // This call will go to the real method
        String result2 = spyService.fetchData("regularId");
        System.out.println("Result for regularId: " + result2);
    }
}

स्पाई इंटरैक्शन का सत्यापन

मॉक की तरह ही, आप अपने स्पाई पर कुछ विधियों को कॉल किए जाने की पुष्टि करने के लिए Mockito.verify() का उपयोग कर सकते हैं। यह पुष्टि करने के लिए शक्तिशाली है कि आपका कोड वास्तविक ऑब्जेक्ट के साथ अपेक्षित तरीके से इंटरैक्ट करता है।

स्पाइज़ के लिए verify() ठीक उसी तरह काम करता है जैसे मॉक के लिए। आप जाँच सकते हैं:

  • क्या किसी विधि को कॉल किया गया था।
  • उसे कितनी बार कॉल किया गया था।
  • उसे किन तर्कों के साथ कॉल किया गया था।

स्पाई कॉल के सत्यापन का उदाहरण

आइए सत्यापित करें कि हमारी fetchData विधि ने वास्तविक कार्यान्वयन चलाने पर भी स्पाई पर कॉल किया था:

import org.mockito.Mockito;

public class DataService {
    public String fetchData(String id) {
        System.out.println("--- Calling REAL fetchData for ID: " + id + " ---");
        return "Real data for " + id;
    }

    public int processData(String data) {
        return data.length();
    }
}

public class Main {
    public static void main(String[] args) {
        DataService realService = new DataService();
        DataService spyService = Mockito.spy(realService);

        // Call a method on the spy (it will execute the real method)
        spyService.fetchData("user1");
        spyService.processData("data1");
        spyService.fetchData("user2");

        // Verify interactions
        Mockito.verify(spyService).fetchData("user1");
        Mockito.verify(spyService, Mockito.times(2)).fetchData(Mockito.anyString());
        Mockito.verify(spyService).processData("data1");

        System.out.println("Verification successful!");
    }
}

स्पाइज़ बनाम मॉक: मुख्य अंतर

यह समझना महत्वपूर्ण है कि स्पाई का उपयोग कब करना है और पारंपरिक मॉक का कब:

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

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

स्पाइज़ का उपयोग कब करें

स्पाइज़ विशेष रूप से इन परिस्थितियों में उपयोगी होते हैं:

  • आप ऐसी class का परीक्षण कर रहे हों जो किसी जटिल निर्भरता के साथ इंटरैक्ट करती है और आपको उस निर्भरता के व्यवहार के केवल छोटे हिस्से को ओवरराइड करना हो।
  • आपके पास कई विधियों वाली पुरानी class हो और पूरा मॉक बनाना कठिन हो, लेकिन आपको यह सुनिश्चित करना हो कि कुछ विधियाँ कॉल हों या विशिष्ट मान लौटाएँ।
  • आप किसी वास्तविक ऑब्जेक्ट को पूरी तरह बदले बिना उसके आंशिक व्यवहार का परीक्षण करना चाहते हों।

हालांकि, इनका सीमित उपयोग करें। स्पाइज़ पर अत्यधिक निर्भरता से परीक्षण कम अलग-थलग और बनाए रखना कठिन हो सकता है।

त्वरित जाँच: स्पाई का व्यवहार

Logger class पर विचार करें, जिसमें कंसोल पर प्रिंट करने वाली log(String message) विधि है। यदि आप किसी new Logger() ऑब्जेक्ट पर स्पाई करें, तो बिना किसी स्टबिंग के spyLogger.log("Test") कॉल करने पर क्या होगा?

पुनरावलोकन: वास्तविक ऑब्जेक्ट पर स्पाई करना

आपने Mockito स्पाइज़ के बारे में सफलतापूर्वक सीख लिया है!

  • स्पाइज़ वास्तविक ऑब्जेक्ट को रैप करते हैं और आपको डिफ़ॉल्ट रूप से उनकी वास्तविक विधियों का उपयोग करने देते हैं।
  • आप इन्हें Mockito.spy(realObject) से बनाते हैं।
  • उनके व्यवहार को ओवरराइड करने के लिए आप doReturn().when(spy).method() का उपयोग करके विशिष्ट विधियों को स्टब कर सकते हैं।
  • मॉक की तरह ही, आप Mockito.verify() का उपयोग करके स्पाइज़ पर हुए इंटरैक्शन का सत्यापन कर सकते हैं।
  • स्पाइज़ का सावधानी से उपयोग करें, मुख्यतः तब जब वास्तविक ऑब्जेक्ट पर आंशिक नियंत्रण चाहिए, न कि पूर्ण अलगाव।

यह लचीलापन जटिल परिदृश्यों के लिए अधिक लक्षित परीक्षण लिखने में आपकी सहायता करता है।

शुरुआत निःशुल्क

एआई शिक्षक के साथ परीक्षण में निपुणता: JUnit, Mockito और एकीकरण परीक्षण सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
12
पाठ
48

अक्सर पूछे जाने वाले प्रश्न

क्या “वास्तविक ऑब्जेक्ट पर जासूसी” पाठ निःशुल्क है?

हाँ — परीक्षण में निपुणता: JUnit, Mockito और एकीकरण परीक्षण अध्ययन पथ के 3 तक कोई भी पाठ, जिसमें “वास्तविक ऑब्जेक्ट पर जासूसी” भी शामिल है, यहाँ वेब पर पूरा पढ़ना निःशुल्क है। इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ इंटरैक्टिव अभ्यास भी उपलब्ध कराता है। परीक्षण में निपुणता: JUnit, Mockito और एकीकरण परीक्षण पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“वास्तविक ऑब्जेक्ट पर जासूसी” में मैं क्या सीखूँगा?

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

क्या परीक्षण में निपुणता: JUnit, Mockito और एकीकरण परीक्षण शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर परीक्षण में निपुणता: JUnit, Mockito और एकीकरण परीक्षण शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 3वाँ पाठ है।

“वास्तविक ऑब्जेक्ट पर जासूसी” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस परीक्षण में निपुणता: JUnit, Mockito और एकीकरण परीक्षण पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर परीक्षण में निपुणता: JUnit, Mockito और एकीकरण परीक्षण पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. वापसी मानों के लिए स्टब बनाना
  2. Mockito तर्क मिलानकर्ता
  3. वास्तविक ऑब्जेक्ट पर जासूसी
  4. अपवाद उत्पन्न करना और लगातार कॉल
← परीक्षण में निपुणता: JUnit, Mockito और एकीकरण परीक्षण पर वापस जाएँ