यूनिट टेस्ट में Mocking और Stubbing

Java में Testing परिचय

Maria Milusheva

Senior Software Engineer

प्रेरणा: डिपेंडेंसीज़

पिछले पाठ में डिपेंडेंसी फ्लो याद करें: करेंसी एक्सचेंज ऐप बैंक सर्वर पर निर्भर है: बैंकिंग डेमो में डिपेंडेंसी फ्लो का Mermaid ग्राफ

कैलकुलेशंस वेरिफाई करना असंभव है क्योंकि करेंसी एक्सचेंज रेट्स स्वभाव से अनपेक्षित होते हैं.

Java में Testing परिचय

टेस्टिंग में डिपेंडेंसी मैनेजमेंट

Mocking - ऐसे सिम्युलेटेड ऑब्जेक्ट्स या बिहेवियर्स बनाना जो असली ऑब्जेक्ट्स की जगह टेस्ट में इस्तेमाल हों, ताकि बाहरी डिपेंडेंसी पर निर्भर हुए बिना टेस्ट कर सकें।


import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

Mocking का उदाहरण

Java में Testing परिचय

Mocking

  • Mock = नाटक में स्टैंड-इन एक्टर जैसा, टेस्ट के संदर्भ में ही असली ऑब्जेक्ट बनकर दिखता है

पिछला पाठ देखें:

public double convertEuroTo(String currency, double amount) {
    double rate = this.bank.getRateEuroTo(currency);
    return amount * rate;
}

➡ टेस्टिंग के लिए EuropeanCentralBankServer का प्रिडिक्टेबल ऑब्जेक्ट बनाएँ

Java में Testing परिचय

Mocking: करेंसी एक्सचेंज

मॉक्स के साथ ऐसे टेस्ट करते हैं:

@Test
void convert_returnsExpectedValue() {
    EuropeanCentralBankServer bank = mock(EuropeanCentralBankServer.class);
    ExchangeApp exchangeApp = new ExchangeApp(bank);

// मॉक को प्रोग्राम करना होगा ताकि यह काम करे when(bank.getRateEuroTo("USD")).thenReturn(1.1);
// मॉक ऑब्जेक्ट से getRateEuroTo कॉल होगा, हमारी प्री-प्रोग्राम्ड वैल्यूज़ मिलेंगी double result = exchangeApp.convertEuroTo("USD", 1000); assertEquals(1100, result); // अब हम एक्ज़ैक्ट रिटर्न वैल्यू पर assert कर सकते हैं }
Java में Testing परिचय

आम गलती

हमें अपने मॉक्स को प्रोग्राम करना कभी नहीं भूलना चाहिए:

@Test
void convert_returnsExpectedValue() {
    EuropeanCentralBankServer bank = mock(EuropeanCentralBankServer.class);
    ExchangeApp exchangeApp = new ExchangeApp(bank);

    // कोई मॉक प्रोग्रामिंग नहीं - मॉक बैंक ऑब्जेक्ट को getRateEuroTo का जवाब देना नहीं आता
    double result = exchangeApp.convertEuroTo("USD", 1000);

    assertEquals(1100, result); // मॉक सेटअप न होने से फेल होगा
}
Java में Testing परिचय

Stubbing

टेस्ट इस तरह फेल होता है:

org.opentest4j.AssertionFailedError: 
Expected :1100.0
Actual   :0.0

मॉक को प्रोग्राम करना stubbing कहलाता है।

Stubbing - टेस्ट के दौरान की जाने वाली कॉल्स के लिए न्यूनतम, पहले से तय जवाब देना, और आमतौर पर टेस्ट में प्रोग्राम की गई चीज़ों से बाहर की कॉल्स का जवाब न देना।

Java में Testing परिचय

Mockito के साथ Exceptions

Mockito से आप एरर परिदृश्य भी सिम्युलेट कर सकते हैं:

EuropeanCentralBankServer bank = mock(EuropeanCentralBankServer.class);
ExchangeApp exchangeApp = new ExchangeApp(bank);
// thenReturn() की जगह thenThrow() इस्तेमाल करें
when(bank.getRateEuroTo("USD"))
        .thenThrow(new RuntimeException("Bank server unavailable."));

exchangeApp.convertEuroTo("USD", 1000); // getRateEuroTo exception थ्रो करेगा
Java में Testing परिचय

अभ्यास करते हैं!

Java में Testing परिचय

Preparing Video For Download...