mocking private static
उदाहरणों के साथ मॉकिटो में मॉकिंग प्राइवेट, स्टेटिक और शून्य विधियाँ सीखें:
हाथों की इस श्रृंखला में मॉकिटो पर ट्यूटोरियल , हम पर एक नजर थी विभिन्न प्रकार के मॉकिटो मैचर्स अंतिम ट्यूटोरियल में।
आम तौर पर, निजी और स्थैतिक तरीकों का मजाक उड़ाना असामान्य मॉकिंग की श्रेणी में आता है।
यदि आवश्यकता निजी और स्थिर तरीकों / कक्षाओं का मजाक उड़ाने की है, तो यह खराब रूप से रिफलेक्टेड कोड को इंगित करता है और वास्तव में एक परीक्षण योग्य कोड नहीं है और सबसे अधिक संभावना है कि कुछ विरासत कोड जो बहुत यूनिट टेस्ट फ्रेंडली नहीं हुआ करते थे।
कहा जाता है कि, अभी भी कुछ यूनिट टेस्टिंग फ्रेमवर्क जैसे पॉवरमॉकिटो (और मॉकिटो द्वारा सीधे नहीं) द्वारा मॉकिंग निजी और स्थिर तरीकों के लिए समर्थन मौजूद है।
मॉकिंग 'शून्य' विधियाँ सामान्य हैं क्योंकि ऐसी विधियाँ हो सकती हैं जो अनिवार्य रूप से कुछ भी नहीं लौटा रही हों, जैसे डेटाबेस रो को अपडेट करना (इसे रेस्ट एपीआई एंडपॉइंट का PUT ऑपरेशन माना जाता है जो किसी इनपुट को स्वीकार करता है और कोई आउटपुट नहीं देता है)।
मॉकिटो मॉकिंग शून्य तरीकों के लिए पूर्ण समर्थन प्रदान करता है, जिसे हम इस लेख में उदाहरणों के साथ देखेंगे।
सबसे अच्छा मुफ्त विंडोज़ 10 मरम्मत सॉफ्टवेयर
आप क्या सीखेंगे:
- पोवर्मॉक - एक संक्षिप्त परिचय
- मॉकिंग प्राइवेट तरीके
- मॉकिंग स्टैटिक मेथड्स
- मॉकिंग शून्य विधियाँ
- सुझाव और युक्ति
- निष्कर्ष
- अनुशंसित पाठ
पोवर्म - एक संक्षिप्त परिचय
मॉकिटो के लिए, निजी और स्थिर तरीकों का मजाक उड़ाने का कोई प्रत्यक्ष समर्थन नहीं है। निजी तरीकों का परीक्षण करने के लिए, आपको इसकी आवश्यकता होगी कोड को रिफलेक्टर करें संरक्षित (या पैकेज) तक पहुंच को बदलने के लिए और आपको स्थैतिक / अंतिम तरीकों से बचना होगा।
मॉकिटो, मेरी राय में जानबूझकर इन प्रकारों के लिए समर्थन प्रदान नहीं करता है, क्योंकि इस प्रकार के कोड निर्माणों का उपयोग कोड गंध और खराब रूप से डिज़ाइन किए गए कोड हैं।
लेकिन, ऐसी रूपरेखाएँ हैं जो निजी और स्थैतिक तरीकों का समर्थन करती हैं।
पोवर्म इजीमॉक और मॉकिटो जैसी अन्य रूपरेखाओं की क्षमताओं का विस्तार करता है और स्थिर और निजी तरीकों का मजाक उड़ाने की क्षमता प्रदान करता है।
# 1) कैसे: प्राइवेट और स्टैटिक मेथड्स, फाइनल क्लासेस, कंस्ट्रक्टर्स वगैरह को सपोर्ट करने के लिए कस्टम बाइटकोड हेरफेर की मदद से पावरमॉक ऐसा करता है।
# 2) समर्थित पैकेज: पॉवर्मॉक 2 एक्सटेंशन एपीआई प्रदान करता है - एक मॉकिटो के लिए और एक मॉकटॉक के लिए। इस लेख के लिए, हम पावर मॉक के लिए मॉकिटो एक्सटेंशन के साथ उदाहरण लिखने जा रहे हैं।
# 3) सिंटेक्स :स्टोव और निजी तरीकों के लिए कुछ अतिरिक्त तरीकों को छोड़कर, पॉवर्मॉकिटो में मॉकिटो के समान लगभग एक सिंटैक्स है।
# 4) पोवर्मॉकिटो सेटअप
क्रमिक आधारित परियोजनाओं में मॉकिटो लाइब्रेरी को शामिल करने के लिए, नीचे दी जाने वाली लाइब्रेरी शामिल हैं:
testCompile group: 'org.powermock', name: 'powermock-api-mockito2', version: '1.7.4' testCompile group: 'org.powermock', name: 'powermock-module-junit4', version: '1.7.4'
इसी तरह की निर्भरता मावेन के लिए भी उपलब्ध हैं।
पावरमॉक-एपी-मॉकिटो 2 - लाइब्रेरी में पॉवर्मॉकिटो के लिए मॉकिटो एक्सटेंशन को शामिल करना आवश्यक है।
पावरमॉक-मॉड्यूल-जून 4 - PowerMockRunner (जो PowerMockito के साथ परीक्षण चलाने के लिए इस्तेमाल किया जाने वाला एक कस्टम धावक है) को शामिल करने के लिए मॉड्यूल की आवश्यकता होती है।
यहां ध्यान देने वाली एक महत्वपूर्ण बात यह है कि PowerMock Junit5 टेस्ट रनर का समर्थन नहीं करता है। इसलिए परीक्षणों को Junit4 के खिलाफ लिखा जाना चाहिए और परीक्षणों को PowerMockRunner के साथ निष्पादित करने की आवश्यकता है।
PowerMockRunner का उपयोग करने के लिए - परीक्षण वर्ग को एनोटेट करने की आवश्यकता है @RunWith (PowerMockRunner.class)
अब विस्तार से निजी, स्थैतिक और शून्य विधियों की चर्चा करते हैं!
मॉकिंग प्राइवेट तरीके
निजी तरीकों से नकल करना, जिसे परीक्षण के तहत एक विधि से आंतरिक रूप से कहा जाता है, निश्चित समय पर अपरिहार्य हो सकता है। Powermockito का उपयोग करते हुए, यह संभव है और सत्यापन rivate VerPPirt 'नामक एक नई विधि का उपयोग करके किया जाता है
चलो ले लो एकउदाहरण जहां परीक्षण के तहत विधि एक निजी विधि कहती है (जो एक बूलियन लौटाती है)। परीक्षण के आधार पर इस पद्धति को सही / गलत मानने के लिए स्टब करने के लिए, इस वर्ग पर एक स्टब स्थापित करने की आवश्यकता है।
इस उदाहरण के लिए, परीक्षण के तहत वर्ग कुछ इंटरफ़ेस चालान और निजी विधि मंगलाचरण पर मजाक के साथ एक जासूस उदाहरण के रूप में बनाया गया है।
मॉक प्राइवेट विधि के महत्वपूर्ण बिंदु:
# 1) टेस्ट विधि या टेस्ट क्लास को @ के साथ एनोटेट करना होगा तैयार करें (ClassUnderTest)। यह एनोटेशन पॉवरमॉकिटो को परीक्षण के लिए कुछ कक्षाएं तैयार करने के लिए कहता है।
ये ज्यादातर वे वर्ग होंगे जिन्हें होना आवश्यक है बाइटकोड ने चालाकी की । आमतौर पर अंतिम कक्षाओं के लिए, निजी और / या स्थैतिक विधियों वाली कक्षाएं जिन्हें परीक्षण के दौरान मज़ाक करने की आवश्यकता होती है।
उदाहरण:
@PrepareForTest(PriceCalculator.class)
#दो) एक निजी विधि पर स्टब सेटअप करने के लिए।
वाक्य - विन्यास - जब (नकली या जासूसी उदाहरण, 'PrivateMethodName')। तब पुनर्जन्म (// वापसी मान)
उदाहरण:
when (priceCalculatorSpy, 'isCustomerAnonymous').thenReturn(false);
# 3) Stubbed निजी विधि को सत्यापित करने के लिए।
वाक्य - विन्यास - सत्यापित करें (mockedInstance) .invoke ('privateMethodName')
उदाहरण:
verifyPrivate (priceCalculator).invoke('isCustomerAnonymous');
पूरा परीक्षण नमूना: पिछले लेखों से एक ही उदाहरण जारी रखते हुए, जहां priceCalculator में कुछ मूक निर्भरताएं हैं जैसे कि आइटम सेवा, उपयोगकर्ता सेवा आदि।
हमने एक नई विधि बनाई है, जिसका नाम है - कैल्क्लिप्रिविथप्रीयरमैथोड, जो एक ही कक्षा के अंदर एक निजी पद्धति को कॉल करती है और यह बताती है कि ग्राहक गुमनाम है या नहीं।
@Test @PrepareForTest(PriceCalculator.class) public void calculatePriceForAnonymous_witStubbedPrivateMethod_returnsCorrectPrice() throws Exception { // Arrange ItemSku item1 = new ItemSku(); item1.setApplicableDiscount(5.00); item1.setPrice(100.00); double expectedPrice = 90.00; // Setting up stubbed responses using mocks when(priceCalculatorSpy, 'isCustomerAnonymous').thenReturn(false); when(mockedItemService.getItemDetails(123)).thenReturn(item1); // Act double actualDiscountedPrice = priceCalculatorSpy.calculatePriceWithPrivateMethod(123); // Assert verifyPrivate(priceCalculator).invoke('isCustomerAnonymous'); assertEquals(expectedPrice, actualDiscountedPrice); }
मॉकिंग स्टैटिक मेथड्स
जैसा कि हमने निजी तरीकों के लिए देखा था उसी तरह से स्थैतिक तरीकों का मजाक उड़ाया जा सकता है।
जब परीक्षण के तहत एक विधि, एक ही कक्षा से (या एक अलग वर्ग से) एक स्थिर विधि का उपयोग करना शामिल है, तो हमें परीक्षण से पहले (या परीक्षण वर्ग पर) तैयारी में उस वर्ग को शामिल करने की आवश्यकता होगी।
Mock Static Methods के महत्वपूर्ण बिंदु:
# 1) टेस्ट विधि या टेस्ट क्लास को @ के साथ एनोटेट करना होगा तैयार करें (ClassUnderTest)। निजी तरीकों / कक्षाओं का मजाक उड़ाने के समान, स्थैतिक कक्षाओं के लिए भी यह आवश्यक है।
#दो) स्थिर तरीकों के लिए आवश्यक एक अतिरिक्त कदम है - mockStatic (// स्थिर वर्ग का नाम)
उदाहरण:
mockStatic(DiscountCategoryFinder.class)
# 3) स्थैतिक विधि पर स्टब सेटअप करने के लिए, किसी भी अन्य इंटरफ़ेस / क्लास मॉक इंस्टेंस पर किसी भी विधि को स्टब करने के रूप में अच्छा है।
उदाहरण के लिए: स्टब getDiscountCategory () (जो मानों PREMIUM & GENERAL के साथ एक एनुम डिस्काउंट कैटेगिरी लौटाता है) DiscountCategoryFinder वर्ग की स्थिर विधि, बस इस प्रकार स्टब करें:
when (DiscountCategoryFinder. getDiscountCategory ()).thenReturn(DiscountCategory. PREMIUM );
# 4) अंतिम / स्थिर विधि पर मॉक सेटअप को सत्यापित करने के लिए, VerStatic () विधि का उपयोग किया जा सकता है।
उदाहरण:
verifyStatic (DiscountCategoryFinder.class, times (1));
मॉकिंग शून्य विधियाँ
आइए पहले यह समझने की कोशिश करें कि किस तरह के उपयोग मामलों में स्टबिंग शून्य विधियाँ शामिल हो सकती हैं:
# 1) उदाहरण के लिए विधि कॉल - जो प्रक्रिया के दौरान एक ईमेल सूचना भेजता है।
उदाहरण के लिए :मान लीजिए कि आपके द्वारा अपने ईमेल पर सूचना प्राप्त करने के बाद, आपके इंटरनेट बैंकिंग खाते के लिए अपना पासवर्ड बदल दिया जाता है।
इसे बैंक API के लिए POST कॉल के रूप में / चेंजपासवर्ड के रूप में सोचा जा सकता है जिसमें ग्राहक को एक ईमेल सूचना भेजने के लिए एक शून्य विधि कॉल शामिल है।
#दो) शून्य विधि कॉल का एक अन्य सामान्य उदाहरण DB के लिए अद्यतन अनुरोध हैं जो कुछ इनपुट लेते हैं और कुछ भी वापस नहीं करते हैं।
स्टबलिंग शून्य विधियाँ (अर्थात वे विधियाँ जो कुछ भी वापस नहीं करती हैं, या फिर कोई अपवाद छोड़ते हैं), का उपयोग करके संभाला जा सकता है doNothing (), doThrow () और doAnswer (), doCallRealMethod () फ़ंक्शंस । यह परीक्षण की अपेक्षाओं के अनुसार उपरोक्त तरीकों का उपयोग करके स्टब स्थापित करने की आवश्यकता है।
इसके अलावा, कृपया ध्यान दें कि सभी शून्य विधि कॉल डिफ़ॉल्ट रूप से doNothing () के लिए नकली हैं। इसलिए, भले ही एक स्पष्ट नकली सेटअप नहीं किया गया हो शून्य विधि कॉल, डिफ़ॉल्ट व्यवहार अभी भी करना है ()।
आइए इन सभी कार्यों के उदाहरण देखें:
सभी उदाहरणों के लिए, मान लें कि एक वर्ग हैं StudentScoreUpdates जिसकी एक विधि है गणनासुमस्टस्टोर ()। यह विधि अंकों के योग (इनपुट के रूप में) की गणना करती है और कॉल करती है शून्य तरीका अद्यतन () डेटाबेसइम्प्लीमेंटेशन उदाहरण पर।
public class StudentScoreUpdates { public IDatabase databaseImpl; public StudentScoreUpdates(IDatabase databaseImpl) { this.databaseImpl = databaseImpl; } public void calculateSumAndStore(String studentId, int() scores) { int total = 0; for(int score : scores) { total = total + score; } // write total to DB databaseImpl.updateScores(studentId, total); } }
हम नीचे दिए गए उदाहरणों के साथ मॉक मेथड कॉल के लिए यूनिट टेस्ट लिखेंगे:
(1) doNothing () - doNothing () मॉकिटो में शून्य विधि कॉल के लिए डिफ़ॉल्ट व्यवहार है, यानी भले ही आप शून्य विधि पर कॉल सत्यापित करें (बिना स्पष्ट रूप से शून्य करने के लिए शून्य करने के लिए) (), सत्यापन अभी भी सफल होगा)
public void calculateSumAndStore_withValidInput_shouldCalculateAndUpdateResultInDb() { // Arrange studentScores = new StudentScoreUpdates(mockDatabase); int() scores = {60,70,90}; Mockito.doNothing().when(mockDatabase).updateScores(anyString(), anyInt()); // Act studentScores.calculateSumAndStore('student1', scores); // Assert Mockito.verify(mockDatabase, Mockito.times(1)).updateScores(anyString(), anyInt()); }
DoNothing () के साथ अन्य उपयोग
सेवा मेरे) जब शून्य विधि को कई बार कहा जाता है, और आप अलग-अलग इनवोकेशन के लिए अलग-अलग प्रतिक्रियाओं को सेटअप करना चाहते हैं, जैसे - पहले आह्वान के लिए doNothing () और अगले आह्वान पर एक अपवाद फेंकें।
उदाहरण के लिए :इस तरह मॉक सेट करें:
Mockito. doNothing ().doThrow(new RuntimeException()).when(mockDatabase).updateScores( anyString (), anyInt ());
बी) जब आप उन तर्कों को पकड़ना चाहते हैं जिनके साथ शून्य विधि को बुलाया गया था, तो मॉकिटो में ArgumentCaptor कार्यक्षमता का उपयोग किया जाना चाहिए। यह उन तर्कों का एक जोड़ा सत्यापन देता है, जिन्हें विधि के साथ बुलाया गया था।
उदाहरण के साथ ArgumentCaptor:
public void calculateSumAndStore_withValidInput_shouldCalculateAndUpdateResultInDb() { // Arrange studentScores = new StudentScoreUpdates(mockDatabase); int() scores = {60,70,90}; Mockito.doNothing().when(mockDatabase).updateScores(anyString(), anyInt()); ArgumentCaptor studentIdArgument = ArgumentCaptor.forClass(String.class); // Act studentScores.calculateSumAndStore('Student1', scores); // Assert Mockito.verify(mockDatabase, Mockito.times(1)).updateScores(studentIdArgument.capture(), anyInt()); assertEquals('Student1', studentIdArgument.getValue()); }
# 2) doThrow ()- यह उपयोगी है जब आप केवल एक अपवाद फेंकना चाहते हैं जब शून्य विधि को परीक्षण के तहत विधि से लागू किया जाता है।
उदाहरण के लिए:
Mockito.doThrow(newRuntimeException()).when(mockDatabase).updateScores ( anyString (), anyInt ());
# 3) doAnswer ()- doAnswer () बस कुछ कस्टम लॉजिक करने के लिए एक इंटरफ़ेस प्रदान करता है।
जैसे पारित किए गए तर्कों के माध्यम से कुछ मूल्य को संशोधित करना, कस्टम मान / डेटा वापस करना जो सामान्य स्टब विशेष रूप से शून्य विधियों के लिए वापस नहीं हो सकता था।
प्रदर्शन के प्रयोजन के लिए - मैंने अपडेट करने के लिए स्टेक किया है () 'वापस करने के लिए शून्य विधि' उत्तर () 'और विधि के कहे जाने पर पारित किए गए तर्कों में से एक का मूल्य प्रिंट करना चाहिए।
निम्नलिखित में से कौन टीम की जिम्मेदारी नहीं है?
कोड उदाहरण:
@Test public void calculateSumAndStore_withValidInput_shouldCalculateAndUpdateResultInDb() { // Arrange studentScores = new StudentScoreUpdates(mockDatabaseImpl); int() scores = {60,70,90}; Mockito.doCallRealMethod().when(mockDatabaseImpl).updateScores(anyString(), anyInt()); doAnswer(invocation -> { Object() args = invocation.getArguments(); Object mock = invocation.getMock(); System.out.println(args(0)); return mock; }).when(mockDatabaseImpl).updateScores(anyString(), anyInt()); // Act studentScores.calculateSumAndStore('Student1', scores); // Assert Mockito.verify(mockDatabaseImpl, Mockito.times(1)).updateScores(anyString(), anyInt()); }
# 4) doCallRealMethod ()- आंशिक मोहरे स्टब्स के समान हैं (जहां आप कुछ तरीकों के लिए वास्तविक तरीकों को कॉल कर सकते हैं और बाकी को बाहर निकाल सकते हैं)।
शून्य तरीकों के लिए, मॉकिटो एक विशेष फ़ंक्शन प्रदान करता है जिसे doCallRealMethod () कहा जाता है जिसका उपयोग तब किया जा सकता है जब आप मॉक सेट करने का प्रयास कर रहे हों। यह क्या करेगा, वास्तविक तर्कों के साथ वास्तविक शून्य विधि कहलाता है।
उदाहरण के लिए:
Mockito. doCallRealMethod ().when(mockDatabaseImpl).updateScores( anyString (), anyInt ());
सुझाव और युक्ति
# 1) एक ही परीक्षण विधि / कक्षा में कई स्थिर कक्षाएं शामिल करना- PowerMockito का उपयोग करना यदि अंतिम वर्गों के कई स्टेटिक को मॉक करने की आवश्यकता है तो कक्षा के नाम @ में हैं तैयार करें एनोटेशन को अल्पविराम से अलग मान के रूप में उल्लेख किया जा सकता है (यह अनिवार्य रूप से वर्ग नामों की एक सरणी को स्वीकार करता है)।
उदाहरण:
@PrepareForTest({PriceCalculator.class, DiscountCategoryFinder.class})
जैसा कि ऊपर दिए गए उदाहरण में दिखाया गया है, मान लें कि दोनों PriceCalculator और DiscountCategoryFinder अंतिम वर्ग हैं जिनका मज़ाक उड़ाया जाना आवश्यक है। इन दोनों को तैयारीफॉरटेस्ट एनोटेशन में कक्षाओं की एक सरणी के रूप में उल्लेख किया जा सकता है और परीक्षण विधि में स्टब किया जा सकता है।
# 2) ReadyForTest विशेषता पोजिशनिंग - टेस्ट क्लास में शामिल किए जाने वाले परीक्षणों के संबंध में इस विशेषता की स्थिति महत्वपूर्ण है।
यदि सभी परीक्षणों को एक ही अंतिम वर्ग का उपयोग करने की आवश्यकता होती है, तो यह परीक्षण वर्ग स्तर पर इस विशेषता का उल्लेख करने के लिए समझ में आता है, जिसका अर्थ है कि तैयार वर्ग सभी टेस्ट विधियों के लिए उपलब्ध होगा। इसके विपरीत, यदि परीक्षण विधि पर एनोटेशन का उल्लेख किया गया है, तो यह केवल उस विशेष परीक्षण के लिए उपलब्ध होगा
निष्कर्ष
इस ट्यूटोरियल में, हमने स्थैतिक, अंतिम और शून्य विधियों के लिए विभिन्न तरीकों पर चर्चा की।
यद्यपि बहुत से स्थिर या अंतिम तरीकों का उपयोग करने से परीक्षण में बाधा आती है, और फिर भी, कोड / एप्लिकेशन को विरासत कोड के लिए अधिक आत्मविश्वास प्राप्त करने के लिए यूनिट परीक्षण बनाने में सहायता करने के लिए परीक्षण / मॉकिंग के लिए समर्थन उपलब्ध है, जो आमतौर पर उपयोग नहीं किया जाता है। परीक्षण के लिए डिज़ाइन किया गया।
स्थैतिक और अंतिम तरीकों के लिए, मॉकिटो में आउट ऑफ बॉक्स सपोर्ट नहीं है, लेकिन लाइब्रेरी जैसे पॉवरमॉकिटो (जो मॉकिटो से बहुत सारी चीजें विरासत में मिली हैं) इस तरह का समर्थन प्रदान करता है और इन सुविधाओं का समर्थन करने के लिए वास्तव में बायोटेक हेरफेर करना पड़ता है।
बॉक्स से बाहर मॉकिटो स्टबिंग शून्य विधियों का समर्थन करता है और विभिन्न तरीकों जैसे डूनिंग, डोएनेवर, डॉथ्रो, डॉकरेअल मैथोड आदि प्रदान करता है और परीक्षण की आवश्यकता के अनुसार उपयोग किया जा सकता है।
अक्सर पूछे जाने वाले मॉकिटो साक्षात्कार प्रश्न हमारे अगले ट्यूटोरियल में दिए गए हैं।
PREV ट्यूटोरियल | अगले ट्यूटोरियल
अनुशंसित पाठ
- मॉकिटो ट्यूटोरियल: यूनिट टेस्टिंग में मॉकिंग के लिए मॉकिटो फ्रेमवर्क
- शीर्ष 12 मॉकिटो साक्षात्कार प्रश्न (मॉकिंग फ्रेमवर्क साक्षात्कार)
- C ++ में Static
- जावा थ्रेड्स विथ मेथड्स एंड लाइफ साइकल
- कोड उदाहरणों के साथ मॉकिटो में मोक्स और जासूस बनाना
- मॉकिटो द्वारा प्रदान किए गए विभिन्न प्रकार के मिलान
- दोष निवारण तरीके और तकनीक
- थोक परीक्षण निष्पादन के लिए साबुन में तरीकों का उपयोग कैसे करें - साबुन ट्यूटोरियल # 10