परिचय: void मेथड्स शुरुआती लोगों के लिए सिरदर्द क्यों हैं?
\n\nक्या आपने कभी Mockito के साथ Java में यूनिट टेस्ट लिखा है और अचानक एक दीवार से टकरा गए हैं? लगता है सब कुछ आसान है: आप ऑब्जेक्ट को मॉक करते हैं, उन मेथड्स के लिए व्यवहार सेट करते हैं जो कुछ लौटाते हैं (स्ट्रिंग, संख्या, सूची)। लेकिन जैसे ही बात void मेथड्स की आती है — जो कुछ भी नहीं लौटाते, बल्कि केवल अंदर कुछ करते हैं (जैसे डेटा सेव करना, ईमेल भेजना, एक्शन लॉग करना) — तब अटकना शुरू हो जाता है।
\n\nक्यों? क्योंकि सामान्य when(mock.someMethod()).thenReturn(something) यहाँ काम नहीं करता। कंपाइलर आपको when(mock.voidMethod()).thenReturn(...) लिखने ही नहीं देगा — void मेथड कुछ नहीं लौटाता, और thenReturn यहाँ अर्थहीन है।
यही सवाल — "How to mock void methods with Mockito" — Stack Overflow पर हज़ारों बार देखा गया है। और आज हम इसे हमेशा के लिए समझ लेंगे। आप न केवल void मेथड्स को मॉक करना सीखेंगे, बल्कि इसे सही, सुंदर और बिना दर्द के करना भी सीखेंगे।
\n\nचलिए शुरू करते हैं! 🚀
\n\nपरीक्षण के दृष्टिकोण से void मेथड क्या है?
\n\nVoid मेथड वह मेथड है जो एक क्रिया करता है, लेकिन कोई परिणाम नहीं लौटाता। उदाहरण के लिए:
\n\npublic class EmailService {\n public void sendWelcomeEmail(String email) {\n // यहाँ वास्तविक ईमेल भेजना होता है\n System.out.println("ईमेल भेज रहे हैं " + email + " पर");\n }\n}\n\nवास्तविक प्रोजेक्ट में, हम नहीं चाहते कि हर टेस्ट चलने पर वास्तव में ईमेल भेजा जाए। हमें बस यह जाँचना है कि मेथड को कॉल किया गया था, या इसके निष्पादन को रोकना है, या इसे एक अपवाद फेंकने के लिए मजबूर करना है (त्रुटि प्रबंधन का परीक्षण करने के लिए)।
\n\nइसके लिए Mockito doNothing(), doThrow(), doAnswer() और doCallRealMethod() के साथ विशेष सिंटैक्स प्रदान करता है।
1. सबसे सामान्य मामला: doNothing() — बस void मेथड को रोकना
\n\nयदि आप चाहते हैं कि कॉल करने पर void मेथड कुछ न करे — तो doNothing() का उपयोग करें। यह void मेथड्स के लिए Mockito का डिफ़ॉल्ट व्यवहार है, लेकिन कभी-कभी इसे स्पष्ट रूप से इंगित करना उपयोगी होता है (जैसे पठनीयता के लिए या spy का उपयोग करते समय)।
import org.junit.jupiter.api.Test;\nimport org.junit.jupiter.api.extension.ExtendWith;\nimport org.mockito.Mock;\nimport org.mockito.junit.jupiter.MockitoExtension;\n\nimport static org.mockito.Mockito.*;\n\n@ExtendWith(MockitoExtension.class)\npublic class EmailServiceTest {\n\n @Mock\n private EmailService emailService;\n\n @Test\n void testDoNothing() {\n // सेट करें: sendWelcomeEmail कॉल करने पर कुछ न करें\n doNothing().when(emailService).sendWelcomeEmail(anyString());\n\n // मेथड को कॉल करें\n emailService.sendWelcomeEmail("test@example.com");\n\n // जाँचें कि मेथड वास्तव में कॉल हुआ था\n verify(emailService).sendWelcomeEmail("test@example.com");\n }\n}\n\nमहत्वपूर्ण: यदि आप @Mock का उपयोग कर रहे हैं, तो doNothing() लिखने की आवश्यकता नहीं है — Mockito डिफ़ॉल्ट रूप से void मेथड्स को "डमी" बना देता है। लेकिन यदि आप @Spy (जासूस) का उपयोग कर रहे हैं, तो वास्तविक मेथड कॉल होगा, और इसे रोकने के लिए doNothing() की आवश्यकता है।
2. doThrow() — void मेथड में त्रुटि का अनुकरण
\n\nएक बहुत ही सामान्य कार्य: यह जाँचना कि आपका कोड कैसे प्रतिक्रिया करता है यदि ईमेल भेजने वाली सेवा त्रुटि के साथ विफल हो जाती है। इसके लिए हम void मेथड को एक अपवाद फेंकने के लिए मजबूर करते हैं।
\n\n@Test\nvoid testDoThrow() {\n // सेट करें: sendWelcomeEmail कॉल करने पर RuntimeException फेंकें\n doThrow(new RuntimeException("ईमेल भेजने में त्रुटि"))\n .when(emailService).sendWelcomeEmail(anyString());\n\n // अब मेथड कॉल करने पर अपवाद आएगा\n assertThrows(RuntimeException.class, () -> {\n emailService.sendWelcomeEmail("fail@example.com");\n });\n\n