मॉकिटो की सामान्य "किसी भी ()" विधि का उपयोग करना


194

मेरे पास एक विधि है जिसमें एक सरणी की अपेक्षा है Foo:

public interface IBar {
  void doStuff(Foo[] arr);
}

मैं मॉकिटो का उपयोग करके इस इंटरफ़ेस का मज़ाक उड़ा रहा हूं, और मैं यह कहना चाहता हूं कि doStuff()इसे कहा जाता है, लेकिन मैं यह तर्क नहीं देना चाहता कि क्या तर्क पारित किया जाता है - "परवाह नहीं"।

मैं any()इसके बजाय निम्नलिखित कोड का उपयोग कैसे करूं , सामान्य विधि anyObject()?

IBar bar = mock(IBar.class);
...
verify(bar).doStuff((Foo[]) anyObject());

जवाबों:


111

जावा 8 के बाद से आप तर्क-कम anyविधि का उपयोग कर सकते हैं और प्रकार तर्क कंपाइलर द्वारा अनुमान लगाया जाएगा:

verify(bar).doStuff(any());

व्याख्या

जावा 8 में नई बात यह है कि एक अभिव्यक्ति के लक्ष्य प्रकार का उपयोग इसके उप-अभिव्यक्तियों के प्रकार के मापदंडों का अनुमान लगाने के लिए किया जाएगा। जावा 8 से पहले केवल उन तरीकों का तर्क दिया जाता है जहां टाइप पैरामीटर इंट्रेंस (ज्यादातर समय) के लिए उपयोग किया जाता है।

इस स्थिति में पैरामीटर प्रकार का doStuffलक्ष्य प्रकार होगा any(), और वापसी मान प्रकार any()उस तर्क प्रकार से मेल खाने के लिए चुना जाएगा।

यह तंत्र जावा 8 में मुख्य रूप से लैम्ब्डा एक्सप्रेशन संकलित करने के लिए जोड़ा गया था, लेकिन यह आमतौर पर टाइप इंफ़ेक्शन में सुधार करता है।


आदिम प्रकार

यह आदिम प्रकारों के साथ काम नहीं करता है, दुर्भाग्य से:

public interface IBar {
    void doPrimitiveStuff(int i);
}

verify(bar).doPrimitiveStuff(any()); // Compiles but throws NullPointerException
verify(bar).doPrimitiveStuff(anyInt()); // This is what you have to do instead

समस्या यह है कि संकलक Integerरिटर्न मान के रूप में अनुमान लगाएगा any()। मॉकिटो को इसके बारे में पता नहीं होगा (टाइप इरेज़र के कारण) और संदर्भ प्रकारों के लिए डिफ़ॉल्ट मान लौटाएं, जो कि है null। रनटाइम पास करने से intValueपहले उस पर विधि को कॉल करके रिटर्न वैल्यू को अनबॉक्स करने का प्रयास करेगा doStuff, और अपवाद फेंक दिया जाता है।


मैं हर बार सुखद आश्चर्यचकित होता हूं, क्योंकि इस उत्तर से उत्थान होता है! मैंने अनुमान लगाया होगा कि सवाल जावा 8 के बाद से ज्यादा ध्यान आकर्षित नहीं करेगा, क्योंकि anyविधि को सिर्फ काम करना चाहिए। आप उन चीजों के लिए जवाब नहीं तलाशते हैं जो सिर्फ काम करती हैं!
Lii

मैं यहाँ आया था क्योंकि मुझे नहीं पता था कि मेरे कोड के साथ काम क्यों नहीं किया any()गया, लेकिन ठीक था anyBoolean(), जिसके साथ आपके उत्तर का अंतिम भाग खूबसूरती से प्रकाश डालता है।
एड्रिएनडब्ल्यू

274

यह काम करना चाहिए

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.verify;

verify(bar).DoStuff(any(Foo[].class));

31
बस के मामले में किसी को इसकी जरूरत है स्काला में:verify(bar).DoStuff(any[Array[Foo]])
tolitius

6
मुझे आयात में समस्या थी, मैं अपने आयात में हैमरेस्ट से किसी भी () का उपयोग कर रहा था और यह मॉकिटो से टकरा गया।
डॉपेलगैंगनर

4
कृपया एपीआई में एक नज़र डालें, वर्ग तर्क सिर्फ कास्टिंग के लिए उपयोग किया जाता है, विधि अभी भी किसी भी प्रकार की वस्तु को स्वीकार करती है! site.mockito.org/mockito/docs/current/org/mockito/… । उपयोग ईसा () इस मामले के लिए site.mockito.org/mockito/docs/current/org/mockito/...
थिल्को

1
हैमरेस्ट के साथ एक नाम टकराव से बचने के लिए इस वर्ग को अब हटा दिया गया है। Org.mockito.ArgumentMatchers का उपयोग करें
leo9r

12

आप इसके लिए उपयोग कर सकते हैं Mockito.isA():

import static org.mockito.Matchers.isA;
import static org.mockito.Mockito.verify;

verify(bar).doStuff(isA(Foo[].class));

http://site.mockito.org/mockito/docs/current/org/mockito/Matchers.html#isA(java.lang.Class)


यह सही जवाब है। किसी भी (Clazz) का उपयोग करना पूरी तरह से गलत है।
सुरसिन तन्खारोएन

3
@SurasinTancharoen वास्तव में, कोई भी (क्लास) isa (क्लास) (डॉक्स देखें) का केवल एक अन्य नाम है। तो यह बिल्कुल भी गलत नहीं है।
jmiserez

8

जैसा कि मुझे अपने नवीनतम प्रोजेक्ट के लिए इस सुविधा का उपयोग करने की आवश्यकता थी (एक बिंदु पर हमने १.१०.१ ९ से अपडेट किया था), केवल उपयोगकर्ताओं को रखने के लिए (जो कि पहले से ही मॉकिटो-कोर संस्करण २.१.० या उससे अधिक का उपयोग कर रहे हैं ), स्थैतिक तक उपरोक्त उत्तरों के तरीकों को ArgumentMatchersकक्षा से लिया जाना चाहिए :

import static org.mockito.ArgumentMatchers.isA;
import static org.mockito.ArgumentMatchers.any;

कृपया इसे ध्यान में रखें यदि आप अपने मॉकिटो आर्टिफैक्ट्स को अद्यतित रखने की योजना बना रहे हैं जो संभवतः संस्करण 3 से शुरू हो रहा है, तो यह वर्ग अब मौजूद नहीं हो सकता है:

2.1.0 और इसके बाद के संस्करण के अनुसार, org.mockito.Matchers राज्यों के Javadoc:

का उपयोग करें org.mockito.ArgumentMatchers। हैमरेस्ट * org.hamcrest.Matchers वर्ग के साथ एक नाम के टकराव से बचने के लिए इस वर्ग को अब हटा दिया गया है । यह वर्ग संभवतः संस्करण 3.0 में हटा दिया जाएगा।

यदि आप आगे पढ़ने के लिए हैं तो मैंने मॉकिटो वाइल्डकार्ड पर एक छोटा सा लेख लिखा है ।


मैं Scala में org.mockito.ArgumentMatcher आयात कैसे कर सकता हूं? मैंने आयात करने की कोशिश की। org.mockito.ArgumentMatcher.any मुझे त्रुटि मिलती है `मान किसी भी वस्तु का सदस्य नहीं है। org.mockito.ArgumentMatcher
Manu

क्या आप मुझे बता सकते हैं कि संस्करण 3.0 में समतुल्य क्या है?
मनु चड्ढा

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