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

Mockito तर्क मिलानकर्ता

अपनी पुष्टियों और स्टबिंग को अधिक लचीला और मजबूत बनाने के लिए तर्क मिलानकर्ताओं का उपयोग करें।

पाठ 2, कुल 4 में से12 चरण

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

Mockito के साथ लचीला मिलान

Mockito के साथ इकाई परीक्षण लिखते समय आपको अक्सर दी गई कॉल के आधार पर विधि कॉल का सत्यापन करना या मॉक के व्यवहार को कॉन्फ़िगर करना होता है। कभी-कभी हर तर्क का सटीक मिलान पर्याप्त लचीला नहीं होता।

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

सटीक मिलान क्यों पर्याप्त नहीं होता

डिफ़ॉल्ट रूप से, Mockito तर्कों की तुलना करने के लिए equals() विधि का उपयोग करता है। यह संख्याओं या स्ट्रिंग जैसे सरल प्रकारों और उन ऑब्जेक्ट के लिए पूरी तरह काम करता है जो equals() को सही ढंग से ओवरराइड करते हैं।

  • यदि आपको पूरे ऑब्जेक्ट की सटीकता से सरोकार न हो, बल्कि केवल उसके भीतर की किसी विशेष प्रॉपर्टी से हो, तो क्या होगा?
  • यदि हर बार तर्क के रूप में एक नया ऑब्जेक्ट मिले, लेकिन उसका कंटेंट महत्वपूर्ण हो, तो क्या होगा?

इन मामलों में, केवल सटीक मिलानों पर निर्भर रहने से आपके परीक्षण अस्थिर हो सकते हैं।

वाइल्डकार्ड मिलानकर्ता: `any()`

सबसे सरल और सबसे अधिक उपयोग किया जाने वाला तर्क मिलानकर्ता any() है। यह Mockito को बताता है कि तर्क की उस स्थिति पर निर्दिष्ट प्रकार का कोई भी मान स्वीकार किया जाए।

any() का उपयोग तब करें जब आपकी चिंता केवल इतनी हो कि विधि को सही प्रकार के किसी मान के साथ कॉल किया गया था, न कि उसके सटीक कंटेंट से।

import org.junit.jupiter.api.Test;
import static org.mockito.Mockito.*;

interface MyService {
  void processData(String message, int count);
}

public class AnyMatcherDemo {
  @Test
  void testAnyArgument() {
    MyService mockService = mock(MyService.class);
    mockService.processData("Hello", 5);

    // Verify processData was called with ANY String and ANY int
    verify(mockService).processData(anyString(), anyInt());
    System.out.println("Verified with anyString() and anyInt()!");
  }

  public static void main(String[] args) {
    new AnyMatcherDemo().testAnyArgument();
  }
}

प्रकार-विशिष्ट `any()` मिलानकर्ता

Mockito सामान्य डेटा प्रकारों के लिए विशिष्ट any() मिलानकर्ता उपलब्ध कराता है, जिससे पठनीयता और प्रकार-सुरक्षा बेहतर होती है:

  • anyString(): किसी भी String से मिलान करता है।
  • anyInt(): किसी भी int से मिलान करता है।
  • anyBoolean(): किसी भी boolean से मिलान करता है।
  • anyList(), anySet(), anyMap(): किसी भी संग्रह प्रकार से मिलान करते हैं।
  • any(MyClass.class): MyClass के किसी भी इंस्टेंस से मिलान करता है।

उपलब्ध सबसे विशिष्ट मिलानकर्ता का उपयोग करना अच्छा अभ्यास है।

`eq()` और मिलानकर्ताओं का मिश्रण

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

जब आपको किसी विशिष्ट तर्क के लिए सटीक मिलान चाहिए, लेकिन अन्य तर्क मिलानकर्ताओं का उपयोग कर रहे हों, तब eq(value) का उपयोग करें।

import org.junit.jupiter.api.Test;
import static org.mockito.Mockito.*;

interface MyProcessor {
  void handle(String type, int id);
}

public class EqAndAnyDemo {
  @Test
  void testSpecificAndAny() {
    MyProcessor mockProcessor = mock(MyProcessor.class);
    mockProcessor.handle("EMAIL", 101);
    mockProcessor.handle("SMS", 202);

    // Verify handle was called with "EMAIL" as type and ANY int as id
    verify(mockProcessor).handle(eq("EMAIL"), anyInt());
    System.out.println("Verified handle('EMAIL', anyInt())!");
  }

  public static void main(String[] args) {
    new EqAndAnyDemo().testSpecificAndAny();
  }
}

प्रकार और नल-योग्यता के आधार पर मिलान

सटीक प्रकार या किसी भी मान के अलावा, Mockito अधिक विशिष्ट शर्तों के लिए मिलानकर्ता भी उपलब्ध कराता है:

  • isA(Class clazz): दिए गए class या उसके उपवर्ग का कोई भी इंस्टेंस होने वाले ऑब्जेक्ट से मिलान करता है। कार्यात्मक रूप से यह any(Class.class) के समान है।
  • notNull(): ऐसे किसी भी तर्क से मिलान करता है जो null नहीं है।
  • isNull(): ऐसे किसी भी तर्क से मिलान करता है जो null है।

इनसे आप तर्कों की अपेक्षाओं पर बहुत सूक्ष्म नियंत्रण पा सकते हैं।

उन्नत शर्तें: `and()`, `or()`

जटिल मिलान परिदृश्यों के लिए, आप तार्किक ऑपरेटरों का उपयोग करके कई मिलानकर्ताओं को जोड़ सकते हैं। ये org.mockito.AdditionalMatchers से उपलब्ध होते हैं (या नए संस्करणों में कभी-कभी सीधे Mockito से)।

  • and(matcher1, matcher2): दोनों मिलानकर्ता सही होने पर मिलान करता है।
  • or(matcher1, matcher2): किसी एक मिलानकर्ता के सही होने पर मिलान करता है।
  • not(matcher): मिलानकर्ता के परिणाम को उलट देता है।

इससे आप बहुत विशिष्ट तर्क-शर्तें बना सकते हैं।

import org.junit.jupiter.api.Test;
import static org.mockito.Mockito.*;
import static org.mockito.AdditionalMatchers.*; // For and/or/gt/lt

interface OrderService {
  void placeOrder(int customerId, double amount);
}

public class CombinedMatchersDemo {
  @Test
  void testCombinedMatchers() {
    OrderService mockService = mock(OrderService.class);
    mockService.placeOrder(101, 150.0);
    mockService.placeOrder(105, 50.0);

    // Verify calls where customerId > 100 AND amount > 100.0
    verify(mockService).placeOrder(
        and(gt(100), lt(1000)), // customerId between 101 and 999
        gt(100.0)
    );
    System.out.println("Verified order with customerId > 100 AND amount > 100!");
  }

  public static void main(String[] args) {
    new CombinedMatchersDemo().testCombinedMatchers();
  }
}

`argThat()` से अनुकूलित मिलान

जब अंतर्निर्मित मिलानकर्ता आपकी आवश्यकताओं को पूरा नहीं करते, तब argThat() आपकी सहायता करता है। यह आपको Hamcrest मिलानकर्ता या सरल lambda expression का उपयोग करके कस्टम मिलान-तर्क परिभाषित करने देता है।

यह कई प्रॉपर्टी या आंतरिक स्थितियों के आधार पर जटिल ऑब्जेक्ट की तुलना करने के लिए बेहद शक्तिशाली है।

import org.junit.jupiter.api.Test;
import static org.mockito.Mockito.*;

class Product {
  String name;
  double price;
  Product(String name, double price) { this.name = name; this.price = price; }
  public String getName() { return name; }
  public double getPrice() { return price; }
}

interface ProductRepository {
  void save(Product product);
}

public class ArgThatDemo {
  @Test
  void testArgThatMatcher() {
    ProductRepository mockRepo = mock(ProductRepository.class);
    mockRepo.save(new Product("Laptop", 1200.0));
    mockRepo.save(new Product("Mouse", 25.0));

    // Verify save was called with a product whose price is > 1000
    verify(mockRepo).save(argThat(p -> p.getPrice() > 1000.0));
    System.out.println("Verified product with price > 1000 was saved!");
  }

  public static void main(String[] args) {
    new ArgThatDemo().testArgThatMatcher();
  }
}

मिलानकर्ताओं के साथ स्टबिंग

तर्क मिलानकर्ता केवल सत्यापन के लिए नहीं होते। आप उनका उपयोग when().thenReturn() के साथ मॉक के व्यवहार की स्टबिंग करते समय भी कर सकते हैं। इससे आपका मॉक प्राप्त तर्कों के आधार पर अलग-अलग मान लौटा सकता है या अपवाद उत्पन्न कर सकता है।

यह उन विभिन्न परिदृश्यों का अनुकरण करने के लिए उपयुक्त है जिनमें कोई निर्भरता इनपुट के आधार पर अलग-अलग व्यवहार करती है।

import org.junit.jupiter.api.Test;
import static org.mockito.Mockito.*;

interface DataService {
  String getData(String key);
}

public class StubbingWithMatchers {
  @Test
  void testStubbingWithAny() {
    DataService mockService = mock(DataService.class);

    // Stubbing: if getData is called with "config", return "Config Data"
    when(mockService.getData(eq("config"))).thenReturn("Config Data");
    // Stubbing: if getData is called with ANY other String, return "Default Data"
    when(mockService.getData(anyString())).thenReturn("Default Data");

    System.out.println("Result 1: " + mockService.getData("config"));
    System.out.println("Result 2: " + mockService.getData("user_profile"));
  }

  public static void main(String[] args) {
    new StubbingWithMatchers().testStubbingWithAny();
  }
}

मिलानकर्ताओं के साथ सत्यापन

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

अधिक शक्तिशाली अभिकथनों के लिए आप मिलानकर्ताओं को times(count) या atLeast(count) जैसे सत्यापन मोड के साथ जोड़ सकते हैं।

import org.junit.jupiter.api.Test;
import static org.mockito.Mockito.*;

interface Logger {
  void log(String level, String message);
}

public class VerificationWithMatchers {
  @Test
  void testVerificationWithAny() {
    Logger mockLogger = mock(Logger.class);
    mockLogger.log("INFO", "User logged in.");
    mockLogger.log("ERROR", "Failed to save.");
    mockLogger.log("INFO", "Data processed.");

    // Verify 'log' was called twice with "INFO" and ANY String message
    verify(mockLogger, times(2)).log(eq("INFO"), anyString());
    System.out.println("Verified 2 INFO logs with any message!");
  }

  public static void main(String[] args) {
    new VerificationWithMatchers().testVerificationWithAny();
  }
}

मिलानकर्ता चुनौती

निम्नलिखित Mockito सेटअप और विधि कॉल पर विचार करें:

MyDatabase mockDb = mock(MyDatabase.class);
mockDb.saveRecord("user_1", "John Doe");
mockDb.saveRecord("user_2", "Jane Smith");

कौन-सी verify() कॉल यह सही ढंग से अभिकथित करेगी कि saveRecord को कम-से-कम एक बार ऐसी कुंजी के साथ कॉल किया गया था जो "user_" से शुरू होती है और मान के लिए *कोई भी* स्ट्रिंग स्वीकार करती है?

पुनरावलोकन: तर्क मिलानकर्ता

इस पाठ में आपने Mockito के तर्क मिलानकर्ताओं में दक्षता हासिल की, जो लचीले और मजबूत परीक्षण बनाने की एक शक्तिशाली सुविधा है:

  • हमने any() और किसी भी मान से मिलान करने वाले इसके प्रकार-विशिष्ट रूपों, जैसे anyString(), को समझा।
  • आपने सीखा कि विशिष्ट मानों के लिए eq() को अन्य मिलानकर्ताओं के साथ कैसे जोड़ा जाता है।
  • हमने isA(), notNull() और तार्किक ऑपरेटरों (and(), or()) जैसे उन्नत मिलानकर्ताओं को शामिल किया।
  • आपने देखा कि argThat() पूरी तरह कस्टम मिलान-तर्क की अनुमति देता है।
  • अंत में, हमने मिलानकर्ताओं को स्टबिंग (when()) और सत्यापन (verify()) दोनों परिदृश्यों में लागू किया।

तर्क मिलानकर्ताओं का प्रभावी उपयोग करने से आपके परीक्षण सटीक, कठोर मानों पर कम निर्भर और अपेक्षित व्यवहार पर अधिक केंद्रित होते हैं। इससे वे परिवर्तनों के प्रति अधिक मजबूत बनते हैं।

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

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

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

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

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

क्या “Mockito तर्क मिलानकर्ता” पाठ निःशुल्क है?

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

“Mockito तर्क मिलानकर्ता” में मैं क्या सीखूँगा?

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

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

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

“Mockito तर्क मिलानकर्ता” पाठ पूरा करने में कितना समय लगता है?

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

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

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

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

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