स्टबिंग के लिए ArgumentCaptor का उपयोग कैसे करें?


161

मॉकिटो प्रलेखन और javadocs में यह कहता है

यह सत्यापन के साथ ArgumentCaptor का उपयोग करने की अनुशंसा की जाती है, लेकिन स्टबिंग के साथ नहीं।

लेकिन मुझे समझ में नहीं आता कि स्टबिंग के लिए ArgumentCaptor का उपयोग कैसे किया जा सकता है। क्या कोई उपरोक्त कथन की व्याख्या कर सकता है और यह बता सकता है कि अर्गुमेंटकैप्टर का उपयोग स्टबिंग के लिए कैसे किया जा सकता है या एक लिंक प्रदान कर सकता है जो दिखाता है कि यह कैसे किया जा सकता है?


1
सुपर शॉर्ट और अच्छी व्याख्या यहाँ: dzone.com/articles/…
बेंज

जवाबों:


271

परीक्षण करने के लिए निम्न विधि मानते हुए:

public boolean doSomething(SomeClass arg);

मॉकिटो प्रलेखन कहता है कि आपको इस तरह से कैप्शन का उपयोग नहीं करना चाहिए :

when(someObject.doSomething(argumentCaptor.capture())).thenReturn(true);
assertThat(argumentCaptor.getValue(), equalTo(expected));

क्योंकि आप स्टबिंग के दौरान मैचर्स का उपयोग कर सकते हैं:

when(someObject.doSomething(eq(expected))).thenReturn(true);

लेकिन सत्यापन एक अलग कहानी है। यदि आपके परीक्षण को यह सुनिश्चित करने की आवश्यकता है कि इस पद्धति को एक विशिष्ट तर्क के साथ बुलाया गया था, तो उपयोग करें ArgumentCaptorऔर यह ऐसा मामला है जिसके लिए इसे डिज़ाइन किया गया है:

ArgumentCaptor<SomeClass> argumentCaptor = ArgumentCaptor.forClass(SomeClass.class);
verify(someObject).doSomething(argumentCaptor.capture());
assertThat(argumentCaptor.getValue(), equalTo(expected));

जवाब के लिए धन्यवाद। मेरा एक सवाल है। तीसरे कोड ब्लॉक में हम जानते हैं कि सही केवल तभी लौटाया जाता है जब अपेक्षित doSomething को पास किया जाता है। लेकिन दूसरा कोड ब्लॉक में कब लौटाया जाता है? या someObject हमेशा उस मामले में someMethod के लिए सच लौटाता है?
को नहीं बता सकते

हम्म, मेरा मानना ​​है कि आपका मतलब है "लेकिन तीसरे कोड ब्लॉक में सच कब लौटा है ?"। तीसरे कोड ब्लॉक में हम सिर्फ रिटर्न वैल्यू की परवाह नहीं करते हैं और इसे डिफॉल्ट होने देते हैं। बूलियन के लिए यह falseनहीं है true
रोरिक

नहीं, मैंने सभी ग्रे बैकग्राउंड ब्लॉक को कोड ब्लॉक के रूप में गिना। जिसमें पहला वन लाइनर भी शामिल है। मैं उस लाइन का जिक्र कर रहा था जब (someObject.doSomething (argumentCaptor.capture ()))। फिर रीटर्न (सच);
को नहीं बता सकते

आह क्षमा करें। हां, इस मामले में सच हमेशा वापस आ जाएगा।
रोरिक

3
सुनिश्चित नहीं है कि "स्टबिंग के साथ उपयोग न करने" का कारण एक सरल कारण है। मैचर्स हमें वास्तविक अपेक्षित तर्क (सिर्फ प्रकार) नहीं देते हैं और तर्क के बावजूद गुजरने वाले परीक्षणों के साथ ठीक होने की ओर ले जाते हैं जो गलत हो सकता है।
dtc

0

रेखा

when(someObject.doSomething(argumentCaptor.capture())).thenReturn(true);

के रूप में ही करना होगा

when(someObject.doSomething(Matchers.any())).thenReturn(true);

इसलिए, जब स्टबिंग का कोई अतिरिक्त मूल्य नहीं है, तो argumentCaptor.capture () का उपयोग करें। Matchers.any () का उपयोग करना बेहतर दिखाता है कि वास्तव में क्या होता है और पठनीयता के लिए बेहतर है। तर्ककैप्टर.कैपचर () के साथ, आप पढ़ नहीं सकते कि क्या तर्क वास्तव में मेल खाते हैं। और किसी भी () का उपयोग करने के बजाय, आप अपने परीक्षण को बेहतर बनाने के लिए अधिक जानकारी वाले मेलर्स का उपयोग कर सकते हैं जब आपके पास अधिक जानकारी (अपेक्षित तर्क का वर्ग) हो।

और एक और समस्या: अगर स्टबिंग के दौरान तर्कसंकेतक का उपयोग करें () जब यह स्पष्ट नहीं हो जाता है कि सत्यापन के बाद आपको कितने मूल्यों पर कब्जा करने की उम्मीद करनी चाहिए। हम सत्यापन के दौरान एक मूल्य पर कब्जा करना चाहते हैं, ठूंठ के दौरान नहीं क्योंकि उस बिंदु पर अभी तक कब्जा करने का कोई मूल्य नहीं है। तो स्टबिंग के दौरान तर्क कैप्चरर्स कैप्चर विधि कैप्चर क्या करता है? या यह कुछ भी कब्जा नहीं करता है? मेरे पास इस सवाल का जवाब नहीं है। मैं इसे अपरिभाषित व्यवहार मानता हूं और मैं अपरिभाषित व्यवहार का उपयोग नहीं करना चाहता।


0

हाइपोथेटिक रूप से, यदि खोज इस सवाल पर उतरा तो आप शायद यही चाहते हैं:

doReturn(someReturn).when(someObject).doSomething(argThat(argument -> argument.getName().equals("Bob")));

क्यों? क्योंकि मेरी तरह आप समय को महत्व देते हैं और आप .equalsकेवल एकल परीक्षण परिदृश्य के लिए लागू नहीं करने जा रहे हैं।

और 99% परीक्षण मॉक से वापस आये अशक्त के साथ गिर जाते हैं और एक उचित डिज़ाइन में आप कोटलिन को nullहर कीमत, उपयोग Optionalया स्थानांतरित करने से बचते हैं। इसका तात्पर्य यह है कि verifyइसका उपयोग करने की आवश्यकता नहीं है कि अक्सर और तर्क-वितर्क लिखने के लिए बहुत थकाऊ होते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.