Mocking with Mockito Java In Hindi

Mocking with Mockito Java in Hindi

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

Mocking with Mockito Java In Hindi

Why use a mocking platform framework in Java?

माना की एक सिस्टम एनवायरनमेंट टेस्टिंग मेथड में क्लाइंट की सर्विस ClientService, यह एक ClientRepository पर टोटली डिपेंड होता है.

public class ClientService {

private final ClientRepository repository;

public ClientService(ClientRepository repository) {

this.repository = repository;

}

public Client getClient(long id) {

return repository.findById(id);

}

}

यहाँ ऊपर इस एक्साम्प्ल में एक यूनिट टेस्ट को सिर्फ़ ClientService को टेस्ट करने के लिए एक्चुअल रियल में डेटाबेस की ज़रूरत नहीं होनी चाहिए।

Mockito टेस्टिंग फ्रेमवर्क जावा यूजर को रिपॉजिटरी को मॉक से रिप्लेस करने में हेल्प करता है।

Example of the basic Java Mockito testing framework.

import org.junit.jupiter.api.Test;

import org.junit.jupiter.api.extension.ExtendWith;

import org.mockito.InjectMocks;

import org.mockito.Mock;

import org.mockito.junit.jupiter.MockitoExtension;

import static org.junit.jupiter.api.Assertions.assertEquals;

import static org.mockito.Mockito.*;

@ExtendWith(MockitoExtension.class)

class ClientServiceTest {

    @Mock

    private ClientRepository repository;

    @InjectMocks

    private ClientService clientService;

    @Test

    void shouldReturnClient() {

        // Arrange

        Client client = new Client(109L, “Siddhi”);

        when(repository.findById(109L))

                .thenReturn(client);

        // Act

        Client output = clientService.getClient(109L);

        // Assert

        assertEquals(“Siddhi”, output.getName());

    }

}

What is happening in the Mockito testing above?

@Mock method

private ClientRepository repository;

यह मौजूदा टेस्टिंग फ्रेमवर्क में एक Mockito के लिए एक मॉक एनवायरनमेंट को क्रिएट करता है।

@InjectMocks method

private ClientService clientService;

यह एक ClientService को क्रिएट करता है, और उसमें एक मॉक रिपॉजिटरी को इंजेक्ट करता है।

when(repository.findById(109L))

.thenReturn(client);

यह मौजूदा Mockito टेस्टिंग में एक मॉक के बिहेवियर को इंडीकेट करता है।

Client output = clientService.getClient(109L);

यह एक्चुअल रियल Mockito मेथड को एग्जीक्यूट करता है, जिसे जावा यूजर टेस्ट कर रहे हैं।

assertEquals(“Siddhi”, output.getName());

यह Mockito मेथड के रिजल्ट को चेक या एनालाइज करता है।

when() and thenReturn() Mockito method functions.

जावा यूजर इसमें अलग-अलग Mockito मेथड के रिस्पॉन्स को कॉन्फ़िगर कर सकते हैं.

when(repository.findById(109L))

.thenReturn(new Client(109L, “Siddhi”));

when(repository.findById(110L))

.thenReturn(new Client(110L, “Bhavishi”));

when(repository.findById(113L))

.thenReturn(null);

इसमें जावा यूजर एक कस्टम एक्सेप्शन को भी थ्रो कर सकते हैं.

when(repository.findById(109L))

.thenThrow(new RuntimeException(“This Is a Database error”));

Verifying interactions in Mockito.

यह आपके मौजूदा प्रोग्राम में Mockito को वेरिफ़ाई कर सकता है, जिससे कि उसपे कोई डिपेंडेंसी कॉल की गई थी.

verify(repository).findById(109L);

इसमें जावा यूजर कॉल किए गए नंबर्स को वेरिफ़ाई कर सकते हैं.

verify(repository, times(1)).findById(109L);

या इसमें यूजर के द्वारा कुछ भी कभी कॉल नहीं किया गया था.

verify(repository, never()).deleteById(anyLong());

Example of interactions in Mockito.

@Test method

void shouldFindClientById() {

Client client = new Client(109L, “Siddhi”);

when(repository.findById(109L))

.thenReturn(client);

Client output = clientService.getClient(109L);

assertEquals(“Siddhi”, output.getName());

verify(repository).findById(109L);

}

Argument matchers in Java Mockito.

जावा इसके यूजर को Mockito टेस्टिंग फ्रेमवर्क में मल्टीप्ल ऐसे यूज़फुल मैचर्स फंक्शन मेथड प्रोवाइड करता है. जैसे,

  • anyLong() function method.
  • anyString() function method.
  • anyInt() function method.
  • any() function method.
  • eq() function method.

Example of argument matchers.

when(repository.findById(anyLong()))

.thenReturn(client);

अब इसमें स्टब किसी भी लॉन्ग ID पर अप्लाई होता है। जिसमे जावा यूजर एक मैचर्स को ग्रुप कर सकते हैं.

when(repository.findByNameAndAge(

anyString(),

anyInt()

)).thenReturn(client);

अगर जावा यूजर एक आर्गुमेंट के लिए मैचर का यूज़ करते हैं, तो अन्य आर्गुमेंट्स के लिए भी मैचर्स का यूज़ करें।

// good method

when(repository.findByNameAndAge(

eq(“Siddhi”),

anyInt()

)).thenReturn(client);

@Mock vs. @InjectMocks methods in Java.

@Mock method

यह एक नकली या दिखावटी जावा मॉक टेस्टिंग डिपेंडेंसी मेथड को क्रिएट करता है.

@Mock method

private ClientRepository repository;

@InjectMocks method

यह टेस्ट की जा रही यह एक क्लास को क्रिएट करता है, और उसके मॉक को इंजेक्ट करता है.

@InjectMocks method

private ClientService clientService;

This is a common pattern in the Java Mockito testing framework.

ClientServiceTest

                 |

+– ClientService ← असली क्लास मॉक ऑब्जेक्ट

                 |

+– ClientRepository ← मॉक मेथड

यहाँ जावा यूजर सामान्य रूप से यह चाहते हैं कि टेस्ट की जा रही यूजर डिफाइन एक कस्टम क्लास एक्चुअल या ओरिजिनल हो और उसमे उसकी डिपेंडेंसी को करेक्ट मॉक किया जाए।

The concept of void method mocking in Java.

यहाँ माना की हमारे पास एक यूजर डिफाइन कस्टम क्लास है.

public void deleteClient(long id) {

repository.deleteById(id);

}

जावा क्लाइंट इसमें कॉल को वेरिफ़ाई कर सकते हैं.

@Test method

void shouldDeleteClient() {

clientService.deleteClient(110L);

verify(repository).deleteById(110L);

}

यहाँ जावा यूजर इसमें एक void क्लास मेथड के लिए डिफाइन है, जिसे एक यूजर डिफाइन कस्टम क्लास एक्सेप्शन मैसेज को थ्रो करना चाहिए।

doThrow(new RuntimeException(“This is a Database error”))

.when(repository)

.deleteById(110L);

@Spy Mocks methods concept.

जावा प्रोग्राम सोर्स कोड में एक @Spy मेथड मॉक बिहेवियर को कम्प्लीटली रिप्लेस कर देता है, जबकि एक स्पाई मेथड में एक रियल ऑब्जेक्ट को रैप करता है, और सिलेक्टेड क्लास बिहेवियर को ओवरराइड करने में हेल्प करता है।

@Spy Mocks methods.

private ArrayList<String> list = new ArrayList<>();

इसके बाद जावा यूजर एक स्पेशल क्लास बिहेवियर को स्टब कर सकते हैं।

ज़्यादातर कॉमन जावा यूनिट टेस्ट में, जब डेवलपर को सच में किसी डिपेंडेंसी को आइसोलेट करने की ज़रूरत हो, तो मॉक को प्रेफर करें। स्पाई मेथड का अधिक यूज़ से  मॉक यूनिट टेस्ट को समझना थोड़ा काम्प्लेक्स हो सकता है।

Detail explanation of mock vs stub vs real object.

एक जावा प्रोग्राम में मॉक बनाम स्टब बनाम रियल ऑब्जेक्ट कॉन्सेप्ट आपस में एक दूसरे से किसी न किसी तरह से रिलेटेड हैं, लेकिन मॉक बनाम स्टब बनाम रियल ऑब्जेक्ट दोनों के अपने अपने अलग बिहेवियर पैटर्न मेथड हैं.

#Method TypePurpose of Mock Vs Stub Vs Real Class Object
1.Mock methodJava mock method used to verify interactions with a class dependency with it’s all elements
2.Stub methodStub class method used to provide predetermined class object testing responses
3.Spy methodSpy class method used to wrap a real class object, while allowing us selected behaviour to be controlled in existing class
4.Real objectReal object class object used or apply actual implementation with active program behaviour

Mock vs. Stub vs. Real class Object Example.

when(repository.findById(109L))

.thenReturn(client);

यह मॉक टेस्ट डिपेंडेंसी को पहले से फिक्स एक रिस्पॉन्स प्रोवाइड करता है।

verify(repository).findById(109L);

यह एक इंटरैक्शन मेथड को वेरिफाई करता है।

Common mistakes in the Java Mockito testing framework.

जावा प्रोग्राम में यूजर जिस एक कस्टम क्लास को टेस्ट कर रहे हैं, उसकी मॉकिंग टेस्ट करना।

मॉकिंग करते समय जावा यूजर सामान्य रूप से इसे अवॉयड करे।

@Mock method

private ClientService clientService;

यदि जावा यूजर किसी ClientService को टेस्ट कर रहे हैं, तो यह सामान्य रूप से एक्चुअल क्लास ऑब्जेक्ट होना चाहिए।

@InjectMocks method

private ClientService  clientService;

Overusing mocks in Java.

  • हर जावा यूजर डिफाइन ऑब्जेक्ट क्लास को आप अपने आप मॉक फ्रेमवर्क में टेस्ट न करें। जब इसमें आइसोलेशन टास्क एक्टिविटीज हो, तो जावा यूजर एक्सटर्नल या इंडिपेंडेंट डिपेंडेंसी को जरूर मॉक करें।
  • प्रोग्राम बिहेवियर के बदले इसके इम्प्लीमेंटेशन की प्रॉपर टेस्टिंग को अप्लाई करें।
  • जब मौजूदा प्रोग्राम में एक ऑब्जर्वेबल रिजल्ट ही रिलाएबल है, तो जावा यूजर ऐसे टेस्ट से बचें, जो हर इंटरनल क्लास मेथड कॉल को रिस्पांस करते हैं।

For example, this can be unnecessarily fragile.

verify(repository).findById(109L);

verify(cache).get(109L);

verify(logger).info(anyString());

verify(metrics).increment();

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

Basic Java Program Mockito Pattern.

जावा यूजर इस वर्कफ़्लो को अपने जावा प्रोग्राम में याद रखें।

// 1. Arrange the method

when(repository.findById(109L))

.thenReturn(client);

// 2. Act the method

Client output = clientService.getClient(109L);

// 3. Assert method

assertEquals(“Siddhi”, output.getName());

//4. Verify (when class interactions matter)

verify(repository).findById(109L);

Conclusion of Mocking with Mockito In Java.

जावा प्रोग्राम में Mockito यूनिट टेस्टिंग फ्रेमवर्क का स्पेशल पर्पस सोर्स कोड को आइसोलेशन करना है, जिसमे यूनिट टेस्टिंग मेथड डिपेंडेंसी को प्रेडिक्टेबल क्रिएट करना है. जिससे कि आपका टेस्ट उस क्लास के बिहेवियर पर फोकस कर सके जिसे आप रियल में एनालाइज या टेस्ट करने जा रहे हैं।

Leave a Reply