different types matchers provided mockito
विंडोज़ 10 के लिए सबसे अच्छा सिस्टम क्लीनर
मॉकिटो में विभिन्न प्रकार के मिलानकर्ताओं का परिचय।
मॉकिटो में मोक्स और जासूस विस्तार से हमारे पिछले ट्यूटोरियल में विस्तार से बताया गया मॉकिटो प्रशिक्षण श्रृंखला ।
मैचर्स क्या हैं?
मिलान रेगेक्स या वाइल्डकार्ड जैसे होते हैं, जहां एक विशिष्ट इनपुट (और आउटपुट) के बजाय, आप एक सीमा / प्रकार का इनपुट / आउटपुट निर्दिष्ट करते हैं, जिसके आधार पर स्टब्स / जासूस आराम कर सकते हैं और स्टब्स को कॉल को सत्यापित किया जा सकता है।
सभी मॉकिटो मैचर्स ito का एक हिस्सा हैं मॉकिटो ' स्थिर वर्ग।
माचिस एक शक्तिशाली उपकरण है, जो उपयोग-केस या परिदृश्य के आधार पर विशिष्ट प्रकारों के लिए लॉजिक इनपुट के रूप में तर्क इनपुट का उल्लेख करके स्टब्स पर चालान की पुष्टि करने के साथ-साथ स्टॉब स्थापित करने का एक संक्षिप्त तरीका सक्षम करता है।
आप क्या सीखेंगे:
मॉकिटो में मिलान के प्रकार
मॉकिटो में मोटे तौर पर 2 प्रकार के मैचर्स होते हैं या उपयोग के संदर्भ में, मिलानकर्ताओं का उपयोग नीचे की 2 श्रेणियों के लिए किया जा सकता है:
- स्टब सेटअप के दौरान तर्क मिलान
- स्टब के लिए वास्तविक कॉल की पुष्टि करने के लिए सत्यापन मिलान
दोनों प्रकार के मिलानों के लिए अर्थात् तर्क और सत्यापन, मॉकिटो मैचर्स का एक बड़ा समूह प्रदान करता है (क्लिक करें यहां मिलानकर्ताओं की पूरी सूची प्राप्त करने के लिए)।
तर्क मिलान करने वाले
नीचे सूचीबद्ध सबसे व्यापक रूप से उपयोग किए जाने वाले हैं:
सभी नीचे के लिए, आइए एक इंटेगरलिस्ट के परीक्षण पर विचार करें:
final List mockedIntList = mock(ArrayList.class);
# 1) any () - किसी भी ऑब्जेक्ट (शून्य सहित) को स्वीकार करता है।
when (mockedIntList.get( any ())).thenReturn(3);
#दो) कोई भी (जावा भाषा वर्ग) -
उदाहरण : कोई भी (ClassUnderTest.class) - यह किसी भी () का एक अधिक विशिष्ट संस्करण है और केवल उसी प्रकार की वस्तुओं को स्वीकार करेगा जो टेम्पलेट पैरामीटर के रूप में उल्लिखित हैं।
when (mockedIntList.get( any (Integer.class))).thenReturn(3);
# 3) anyBoolean (), anyByte (), anyInt (), anyString (), anyDouble (), anyFloat (), anyList () और कई और अधिक - ये सभी संबंधित डेटा प्रकार के किसी भी ऑब्जेक्ट के साथ-साथ अशक्त मानों को स्वीकार करते हैं।
when (mockedIntList.get( any Int())).thenReturn(3);
# 4) विशिष्ट तर्क - ऐसे मामलों में जहां वास्तविक तर्क पहले से ज्ञात हैं, इसकी हमेशा उपयोग करने की सिफारिश की गई क्योंकि वे सामान्य तर्क प्रकारों के मुकाबले अधिक आत्मविश्वास प्रदान करते हैं।
उदाहरण:
when(mockedIntList.get(1)).thenReturn(3);
सत्यापन मिलान
कुछ विशेष मैचर्स हैं जो उम्मीद की चीजों के लिए उपलब्ध हैं। नकली पर चालान की।
नीचे दिए गए सभी मिलानकर्ताओं के लिए, उदाहरण के लिए उसी सूची पर विचार करें जिसका हमने पहले उपयोग किया है।
final List mockedIntList = mock(ArrayList.class);
# 1) नकली चालान
(मैं) मॉक पर सरल आह्वान सत्यापित करता है कि मॉक की गई सूची का आकार 5 तक सेट करके मॉकड विधि को बुलाया / इंटरैक्ट किया गया था या नहीं।
//arrange when(mockedList.size()).thenReturn(5); // act int size = mockedList.size(); // assert verify(mockedList).size();
(ii) एक नकली विधि के साथ बातचीत की विशिष्ट गणना संख्या की गिनती की पुष्टि करती है। समय के मॉक को बुलाया जाने की उम्मीद थी।
उन्नत सी ++ साक्षात्कार प्रश्न
//arrange when(mockedList.size()).thenReturn(5); // act int size = mockedList.size(); // assert verify(mockedList, times(1)).size();
0 इंटरैक्शन के लिए सत्यापित करने के लिए, बस 1 से 0 के मान को समय () मिलानकर्ता के तर्क के रूप में बदलें।
//arrange when(mockedList.size()).thenReturn(5); // act int size = mockedList.size(); // assert verify(mockedList, times(0)).size();
विफलताओं के मामले में, यह निम्नलिखित अपवाद लौटाता है:
सेवा मेरे) जब अपेक्षित इनवॉइस वास्तविक इनवोकेशन से कम हो:
उदाहरण: 2 बार वांटेड, लेकिन 3 बार आमंत्रित किया गया, फिर मॉकिटो रिटर्न - ' सत्यापन .ooManyActualInvocations '
उदाहरण कोड:
final List mockedIntList = mock(ArrayList.class); // Arrange when(mockedIntList.get(anyInt())).thenReturn(3); // Act int response = mockedIntList.get(5); response = mockedIntList.get(3); response = mockedIntList.get(100); // Assert verify(mockedIntList, times(2)).get(anyInt());
बी) जब अपेक्षित आह्वान वास्तविक आह्वान से अधिक हो:
उदाहरण: 2 बार वांटेड, लेकिन 1 बार आमंत्रित किया गया, फिर मॉकिटो रिटर्न - ' सत्यापन .ooLittleActualInvocations '
final List mockedIntList = mock(ArrayList.class); // Arrange when(mockedIntList.get(anyInt())).thenReturn(3); // Act int response = mockedIntList.get(5); response = mockedIntList.get(3); response = mockedIntList.get(100); // Assert verify(mockedIntList, times(4)).get(anyInt());
(iii) नकली वस्तु की विशिष्ट विधि के साथ कोई बातचीत नहीं।
final List mockedIntList = mock(ArrayList.class); // Arrange when(mockedIntList.get(anyInt())).thenReturn(3); // Act int response = mockedIntList.get(5); // Assert verify(mockedIntList, never()).size();
(iv) नकली बातचीत के क्रम को सत्यापित करें - यह विशेष रूप से उपयोगी है जब आप उस आदेश को सुनिश्चित करना चाहते हैं जिसमें नकली वस्तुओं पर तरीकों को बुलाया गया था।
उदाहरण: डेटाबेस जैसे ऑपरेशन जहां एक परीक्षण को उस क्रम को सत्यापित करना चाहिए जिसमें डेटाबेस अपडेट हुआ था।
उदाहरण के लिए इसे समझाने के लिए - उदाहरण के समान सूची के साथ जारी रखें।
अब मान लेते हैं कि सूची विधियों में कॉल का क्रम अनुक्रम में है (जैसे) (5), आकार (), मिलता है (2)। तो, सत्यापन का क्रम समान होना चाहिए।
// Arrange when(mockedIntList.get(anyInt())).thenReturn(3); when(mockedIntList.size()).thenReturn(100); InOrder mockInvocationSequence = Mockito.inOrder(mockedIntList); // Act int response = mockedIntList.get(5); int size = mockedIntList.size(); response = mockedIntList.get(2); // Assert mockInvocationSequence.verify(mockedIntList, times(1)).get(anyInt()); mockInvocationSequence.verify(mockedIntList).size(); mockInvocationSequence.verify(mockedIntList, times(1)).get(anyInt());
गलत सत्यापन अनुक्रम के मामले में, मॉकिटो द्वारा एक अपवाद फेंका गया है - अर्थात सत्यापन ”।
इसलिए उपर्युक्त उदाहरण में, यदि मैं अंतिम 2 लाइनों को इंटरचेंज करके सत्यापन के क्रम को बदलता हूं, तो मुझे VerificationInOrderFailure अपवाद मिलना शुरू हो जाएगा।
// Arrange when(mockedIntList.get(anyInt())).thenReturn(3); when(mockedIntList.size()).thenReturn(100); InOrder mockInvocationSequence = Mockito.inOrder(mockedIntList); // Act int response = mockedIntList.get(5); int size = mockedIntList.size(); response = mockedIntList.get(2); // Assert mockInvocationSequence.verify(mockedIntList, times(1)).get(anyInt()); mockInvocationSequence.verify(mockedIntList, times(1)).get(anyInt()); mockInvocationSequence.verify(mockedIntList).size();
(v) सत्यापित करें कि सहभागिता कम से कम / अधिकतम बार हुई है।
(सेवा मेरे) कम से कम:
उदाहरण: कम से कम (3) - सत्यापित करता है कि परीक्षण के दौरान नकली वस्तु को तीन बार मिलाया गया था। तो किसी भी बातचीत 3 या 3 से अधिक सत्यापन को सफल बनाना चाहिए।
// Arrange when(mockedIntList.get(anyInt())).thenReturn(3); // Act int response = mockedIntList.get(5); response = mockedIntList.get(2); // Assert verify(mockedIntList, atLeast(2)).get(anyInt());
त्रुटियों के मामले में यानी जब वास्तविक आह्वान मेल नहीं खाते हैं, उसी अपवाद को समय के साथ फेंक दिया जाता है () मिलानकर्ता यानी ' सत्यापन .ooLittleActualInvocations '
(बी) अधिक से अधिक:
उदाहरण: कम से कम (3) - सत्यापित करता है कि परीक्षण के दौरान नकली वस्तु को अधिकतम तीन बार मिलाया गया / मिलाया गया। तो मॉक के साथ 0,1,2 या 3 इंटरैक्शन में से किसी को भी सत्यापन को सफल बनाना चाहिए।
// Arrange when(mockedIntList.get(anyInt())).thenReturn(3); // Act int response = mockedIntList.get(5); response = mockedIntList.get(2); // Assert verify(mockedIntList, atMost(2)).get(anyInt()); verify(mockedIntList, atMost(2)).size();
# 2) तर्क मिलान
उपर्युक्त आह्वान में, तर्क को मिलान करने वालों के साथ मेल मिलाप किया जा सकता है, जिसके साथ मॉक को बुलाया गया था।
- कोई()
- विशिष्ट मान - विशिष्ट मानों के साथ सत्यापित करें जब तर्कों को पहले से जाना जाता है।
- अन्य तर्क मिलानकर्ता जैसे - anyInt (), anyString () आदि।
सुझाव और युक्ति
# 1) सत्यापन के दौरान तर्क कैप्चर का उपयोग करना
तर्क कैप्चर सत्यापन आम तौर पर उपयोगी होता है जहां कुछ स्टब्ड विधि द्वारा उपयोग किए जाने वाले तर्क को सीधे विधि कॉल के माध्यम से पारित नहीं किया जाता है, लेकिन आंतरिक रूप से परीक्षण के तहत विधि कहा जाता है।
यह अनिवार्य रूप से उपयोगी है जहां आपका तरीका एक या एक से अधिक सहयोगियों पर निर्भर करता है जिनके व्यवहार को ठूंसा गया है। इन सहयोगियों को दिए गए तर्क एक आंतरिक वस्तु या पूरी तरह से नए तर्क सेट हैं।
वास्तविक तर्क को सत्यापित करना जिसके साथ सहयोगियों को बुलाया गया है, उस कोड में बहुत विश्वास सुनिश्चित करता है जिसे परीक्षण किया जा रहा है।
मॉकिटो ArgumentCaptor प्रदान करता है जिसका उपयोग सत्यापन के साथ किया जा सकता है और फिर जब 'AgumentCaptor.getValue ()' कहा जाता है, तो हम अपेक्षित के खिलाफ वास्तविक कैप्चर किए गए तर्क को मुखर कर सकते हैं।
इसे समझने के लिए, नीचे दिए गए उदाहरण का संदर्भ लें:
नीचे दी गई विधि में, कैलक्लिपप्राइस वह मॉडल है जिसे इनवेंटरीमॉडल वर्ग बॉडी के अंदर बनाया गया है जो तब अपडेट के लिए इनवेंटरी सर्विस द्वारा उपयोग किया जाता है।
अब अगर आप यह जांचने के लिए एक परीक्षण लिखना चाहते हैं कि इन्वेंट्री सर्विस किस तर्क के साथ बुलाई गई थी, तो आप बस इन्वेंटरीमॉडल क्लास के ArgumentCaptor ऑब्जेक्ट का उपयोग कर सकते हैं।
परीक्षण के तहत विधि:
public double calculatePrice(int itemSkuCode) { double price = 0; // get Item details ItemSku sku = itemService.getItemDetails(itemSkuCode); // update item inventory InventoryModel model = new InventoryModel(); model.setItemSku(sku); model.setItemSuppliers(new String(){'Supplier1'}); inventoryService.updateInventory(model, 1); return sku.getPrice(); }
टेस्ट कोड: वेरीफिकेशन चरण देखें, जहां इन्वेंट्री सर्विस सत्यापित है, जहां तर्क का मिलान किया जाना है।
इसके बाद ArgumentCaptor ऑब्जेक्ट पर getValue () विधि को लागू करके मान का मूल्यांकन करें।
उदाहरण: तर्कसंकेतकओबजेक्ट .getValue ()
public void calculatePrice_withValidItemSku_returnsSuccess() { // Arrange ItemSku item1 = new ItemSku(); item1.setApplicableDiscount(5.00); item1.setPrice(100.00); CustomerProfile customerProfile = new CustomerProfile(); customerProfile.setExtraLoyaltyDiscountPercentage(2.00); double expectedPrice = 93.00; // Arrange when(mockedItemService.getItemDetails(anyInt())).thenReturn(item1); ArgumentCaptor argCaptorInventoryModel = ArgumentCaptor.forClass(InventoryModel.class); // Act priceCalculator.calculatePrice(1234); // Assert verify(mockedItemService).getItemDetails(anyInt()); verify(mockedInventoryService).updateInventory(argCaptorInventoryModel.capture(), eq(1)); assertEquals(argCaptorInventoryModel.getValue().itemSku, item1);
ArgumentCaptor के बिना यह पहचानने का कोई तरीका नहीं होगा कि सेवा कॉल किस तर्क के साथ की गई थी। सर्वोत्तम संभव है कि तर्कों को सत्यापित करने के लिए 'किसी भी ()' या 'किसी (InventoryModel.class)' का उपयोग किया जाए।
मेलर्स का उपयोग करते समय # 2) सामान्य अपवाद / त्रुटियां
माचिस का उपयोग करते समय, कुछ निश्चित परंपराएं हैं जिनका पालन किया जाना चाहिए, यदि उनका पालन नहीं किया जाता है, तो एक अपवाद का परिणाम होता है। सबसे आम जो मैं भर आया था, वह ठूंठ और सत्यापित करते हुए।
यदि आप किसी भी तर्क का उपयोग कर रहे हैंमैचर्स और यदि स्टब्ड विधि में एक से अधिक तर्क हैं, तो या तो सभी तर्कों का उल्लेख मैचर्स के साथ किया जाना चाहिए, और उनमें से किसी का भी मैचर्स नहीं होना चाहिए। अब, इसका क्या मतलब है?
आइए इस परिदृश्य को समझने की कोशिश करें (और फिर इस परिदृश्य के लिए कोड नमूना)
- मान लीजिए परीक्षण के तहत विधि में एक हस्ताक्षर है -
concatenateString (स्ट्रिंग arg1, स्ट्रिंग arg2) - अब जब स्टबिंग - मान लें कि आप arg1 का मूल्य जानते हैं, लेकिन arg2 अज्ञात है, इसलिए आप एक तर्क मिलानकर्ता का उपयोग करने का निर्णय लेते हैं जैसे - कोई भी () या कोई भी स्ट्रिंग () और किसी पाठ जैसे पहले तर्क के लिए मान निर्दिष्ट करना 'हैलो'।
- जब उपरोक्त चरण को लागू किया जाता है और परीक्षण निष्पादित किया जाता है, तो परीक्षण एक अपवाद को फेंक देता है जिसे 'InvalidUseOfMatcherExpress' कहा जाता है
आइए इसे एक उदाहरण से समझने की कोशिश करें:
टेस्ट कोड:
// Arrange when(a gMatcher.concatenateString('hello', anyString())).thenReturn('hello world!'); // Act String response = argMatcher.concatenateString('hello', 'abc'); // Assert verify(argMatcher).concatenateString(anyString(), anyString());
परीक्षण के तहत कक्षा:
public class ArgMatcher { public String concatenateString(String arg1, String arg2) { return arg1.concat(arg2); } }
जब उपरोक्त परीक्षण निष्पादित किया जाता है, तो यह ' InvalidUseOfMatchersException '
अब, इस अपवाद का कारण क्या है?
काम में कठिन परिस्थितियों से निपटना
यह पार्ट मैचर्स और पार्ट फिक्स्ड स्ट्रिंग का उपयोग करके स्टबिंग है यानी हमने एक तर्क मिलानकर्ता को 'हैलो' के रूप में और दूसरे को किसी भीस्ट्रिंग () के रूप में उल्लेख किया है। अब इन प्रकार के अपवादों से छुटकारा पाने के 2 तरीके हैं (कृपया ध्यान दें - यह व्यवहार मॉक सेटअपों के साथ-साथ व्यवहार पर भी लागू होता है)।
# 1) सभी तर्कों के लिए तर्क मिलान का उपयोग करें:
// Arrange when(a gMatcher.concatenateString(anyString(), anyString())).thenReturn('hello world!'); // Act String response = argMatcher.concatenateString('hello', 'abc'); // Assert verify(argMatcher).concatenateString(anyString(), anyString());
# 2) eq () का उपयोग तर्क मिलानकर्ता के रूप में करें जहां तर्क ज्ञात हो। इसलिए तर्क को 'हैलो' के रूप में निर्दिष्ट करने के बजाय, इसे 'eq (' हैलो ') के रूप में निर्दिष्ट करें और इसे स्टबिंग को सफल बनाना चाहिए।
// Arrange when(argMatcher.concatenateString(anyString(), eq('world'))).thenReturn('hello world!'); // Act String response = argMatcher.concatenateString('hello', 'world'); // Assert verify(argMatcher).concatenateString(anyString(), eq('world'));
निष्कर्ष
इस लेख में, हमने देखा कि मॉकिटो द्वारा प्रदान किए गए विभिन्न प्रकार के मिलानों का उपयोग कैसे करें।
यहां, हमने सबसे अधिक उपयोग होने वाले लोगों को कवर किया। पूरी सूची के संदर्भ में, मॉकिटो लाइब्रेरी प्रलेखन संदर्भ का एक अच्छा स्रोत है।
मॉकिंग के निजी, स्टेटिक और शून्य तरीकों के बारे में अधिक जानने के लिए हमारे आगामी ट्यूटोरियल को देखें।
PREV ट्यूटोरियल | अगले ट्यूटोरियल
अनुशंसित पाठ
- कोड उदाहरणों के साथ मॉकिटो में मोक्स और जासूस बनाना
- मॉकिटो ट्यूटोरियल: यूनिट टेस्टिंग में मॉकिंग के लिए मॉकिटो फ्रेमवर्क
- सॉफ्टवेयर परियोजनाओं में जोखिम के प्रकार
- पायथन डेटा प्रकार
- C ++ डेटा प्रकार
- शीर्ष 12 मॉकिटो साक्षात्कार प्रश्न (मॉकिंग फ्रेमवर्क साक्षात्कार)
- मॉकिटो का उपयोग करते हुए मॉकिंग प्राइवेट, स्टेटिक और शून्य तरीके
- C ++ में इनहेरिटेंस के प्रकार