6.1 स्थैतिक विधि का मजाक उड़ाना mockStatic()

और एक और महत्वपूर्ण बिंदु स्थैतिक तरीकों का उपहास और सत्यापन है। "इसमें क्या गलत है?" आप पूछते हैं। हाँ, स्थैतिक, लेकिन तरीके समान हैं। और आप गलत होंगे।

याद रखें कि हमने नकली वस्तुओं के बारे में कहाँ से सीखना शुरू किया था? चूंकि इन वस्तुओं को कृत्रिम रूप से DynamicProxy. और स्थैतिक विधियाँ किसी भी वस्तु के लिए बाध्य नहीं हैं और उनके माध्यम से कॉल को रोकना DynamicProxyअसंभव है । बस इतना ही।

लेकिन मॉकिटो के निर्माता यहां भी चकमा देने में सक्षम थे - उन्होंने अपना खुद का क्लास लोडर लिखा और इसकी मदद से वे फ्लाई पर कक्षाओं को बदलने में सक्षम थे। एक बड़ा और कठिन काम, लेकिन फिर भी वे इसे करने में सफल रहे।

आपको इसमें एक अतिरिक्त लाइब्रेरी जोड़ने की आवश्यकता होगी pom.xml:

<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-inline</artifactId>
    <version>4.2.0</version>
    <scope>test</scope>
</dependency>

यहां बताया गया है कि अगर आपको स्टैटिक मेथड को मॉक करने की जरूरत है तो कैसे काम करें।

1 एक विशेष मॉक क्लास ऑब्जेक्ट बनाएँ:

MockedStatic<ClassName>managerObject = Mockito.mockStatic(ClassName.class);

2 इस ऑब्जेक्ट में ऑपरेशन नियम जोड़ें:

नियम की इस वस्तु के लिए अन्य तरीकों से चिपटना आवश्यक है।

managerObject.when(ClassName::method name).thenReturn(result);

3 इस वस्तु के उपयोग को लपेटनाtry-with-resources सुनिश्चित करें ताकि वस्तु तुरंत हटा दी जाए और मॉकिटो इससे जुड़े नियमों को साफ कर सके।

उदाहरण:

@Test
void givenStaticMethodWithNoArgs () {
    try (MockedStatic< StaticUtils> utilities =  Mockito.mockStatic( StaticUtils.class)) {
        // add rule
         utilities.when(StaticUtils::name).thenReturn("Hello");

        // check if the rule works
        assertEquals("Hello", StaticUtils.name());
    }
}

एनोटेशन @Mockऔर के साथ उतना सुंदर नहीं @Spyहै, लेकिन बहुत ही व्यावहारिक है। परीक्षण लिखना बहुत मुश्किल था जब परीक्षण के तहत विधियों के अंदर उपयोग की जाने वाली एक साधारण स्थैतिक विधि का नकल करना असंभव था।