Mockito.any () जेनरिक के साथ इंटरफ़ेस पास करें


170

क्या जेनरिक के साथ इंटरफेस के प्रकार को पारित करना संभव है?

अंतरपटल:

public interface AsyncCallback<T>

मेरी परीक्षा विधि में:

Mockito.any(AsyncCallback.class)

लाना <ResponseX>के पीछे या के लिए .classकाम नहीं किया।

जवाबों:


306

एक सुरक्षित तरीका है: इसका उपयोग करें ArgumentMatchers.any()और इसे इस प्रकार से योग्य बनाएं:

ArgumentMatchers.<AsyncCallback<ResponseX>>any()

4
मैं इस उत्तर कार्यों की पुष्टि करता हूं और चेतावनी को सही ढंग से दबाता हूं।
केविनरपे

1
यह वास्तव में सुरक्षित नहीं है क्योंकि वास्तविक विधि को केवल सही ढंग से टाइप किए गए तर्क के साथ कहा जा सकता है। यह सिर्फ पूर्व java8 संकलक को संतुष्ट करने के लिए आवश्यक था, जिसमें इस प्रकार के प्रकार की कमी थी।
हरमन

मैंने इस ResponseEntity <List <Map <String, Object >>> responseEntity = Matchers; <ResponseEntity <List <Map <String, Object >>>> any (); और यह हमेशा अशक्त रहता है
अरुण

6
मॉकिटो के नए संस्करणों के साथ:(Matchers.<AsyncCallback<ResponseX>>any()
pierrefevrier

15
Matchersवास्तव में पदावनत है, लेकिन ArgumentMatchersकाम किया।
गुइज़ोब

67

जावा 8 का उपयोग करते हुए, आप केवल any()तर्क के बिना (स्थिर आयात मानकर) उपयोग कर सकते हैं या बढ़ाया प्रकार के अनुमान के कारण पैरामीटर। संकलक अब लक्ष्य प्रकार (विधि तर्क का प्रकार) से जानता है जो आप वास्तव में मतलब है Matchers.<AsyncCallback<ResponseX>>any(), जो कि पूर्व-जावा 8 समाधान है।


के रूप में अच्छी तरह से any()मैच नहीं होगा AsyncCallback<AnyOtherType>?
मैथ्यू

AsyncCallback<AnyOtherType>यदि तर्क प्रकार 'AsyncCallback <ResponseX>' है, तो @MatthewRead का उपयोग करना भी संकलित नहीं करना चाहिए।
हर्मन

1
मैं ऐसी स्थिति के बारे में सोच रहा हूं जहां तर्क प्रकार सामान्य है, लेकिन आप इसे केवल एक ठोस प्रकार के लिए मॉक करना चाहते हैं (या इसे विभिन्न तरीकों से कई प्रकारों के लिए मॉक करें)। यह देखते हुए when(x.y(any())).thenAnswer(...)उदाहरण के लिए, जहां yहै public <T> T y(AsyncCallback<T> arg)। शायद उत्तर में प्रकार की जांच करना बेहतर होगा, अगर इसकी आवश्यकता है?
मैथ्यू

2
@MatthewRead मिटाने के कारण, वास्तविक प्रकार को मॉकिटो द्वारा रनटाइम पर चेक नहीं किया जा सकता है। तो आप भी उपयोग नहीं कर सकते isA()। यदि ऑब्जेक्ट Classऑब्जेक्ट के प्रकार के अनुरूप है, और इंटरफ़ेस इसे उजागर करता है, तो मुझे लगता है कि आप इसे कस्टम मिलानकर्ता में देख सकते हैं। या उदाहरण के लिए, यदि Collectionआप तत्वों के प्रकार की जांच कर सकते हैं।
हरमन

1
MatchersArgumentMatchersMockito v2
bheussler

15

मुझे जेनेरिक के लिए अनुमति देने के लिए निम्नांकित mechamism को अपनाना पड़ा:

import static org.mockito.Matchers.any;
List<String> list = any();
when(callMyMethod.getResult(list)).thenReturn(myResultString);

आशा है कि यह किसी की मदद करता है।


3
मेरा उत्तर देखें: यह जावा 8 के साथ अब आवश्यक नहीं है।
herman

5

उत्तर के रूप में पोस्टिंग पियरएफ़रवियर टिप्पणी जो उपयोगी हो सकती है अगर वह टिप्पणियों के बजाय एक उत्तर में मौजूद हो।

मॉकिटो के नए संस्करणों के साथ: (Matchers.<AsyncCallback<ResponseX>>any()


1
मैंने उनकी टिप्पणी को मूल उत्तर में जोड़ा
जोर्जि

2

आगे थिसोफ़्ट के जवाब में योग्य कॉल को किसी भी () विधि में डालने का मतलब है कि मैं योग्यता को हटा सकता हूं क्योंकि वापसी प्रकार की अनुमति दी गई है:

private HashMap<String, String> anyStringStringHashMap() {
    return Matchers.any();
}

0

यदि आप चाहें, तो आप इसे दबा सकते हैं, चेतावनियों को दबा सकते हैं:

@SuppressWarnings("unchecked")    
AsyncCallback<ResponseX> callback = Mockito.any(AsyncCallback.class)

यदि जावा ने 'जेनेरिक' जेनेरिक को अनुमति दी है तो उनके पास इस तरह की विधि हो सकती है जो आप देख रहे हैं

private static <T, E> T<E> mock(Class<T<E>> clazz)

जब मैंने यह कोशिश की, तो मुझे अपने परीक्षण में एक त्रुटि मिली:You cannot use argument matchers outside of verification or stubbing.
केविनरपे

उपयोग करने के लिए एक अच्छा विचार नहीं है @SuppressWarnings: प्री-जावा 8, यदि आप इसे एक अलग चर में निर्दिष्ट करने जा रहे हैं, तो आप बस any()इनटॉय के उत्तर के रूप में उपयोग कर सकते हैं । अब जावा 8 के साथ, any()एक अलग असाइनमेंट की आवश्यकता के बिना इनलाइन का उपयोग किया जा सकता है।
हरमन

@kevinarpe यदि आपके पास कई तर्क मिलानकर्ता हैं, तो उन्हें जावा भाषा के रूप में निर्दिष्ट किया जाना चाहिए।
ट्वीस्टेरोब

0

मुझे स्प्रिंग का उपयोग करने में इसी तरह की समस्या थी Example:

Mockito.when(repo.findAll(Mockito.<Example<SrvReqToSupplierComment>>any()))
            .thenReturn(Lists.emptyList());

यहां, आपको योग्यता का उपयोग करना होगा, b / c findAll पद्धति कई प्रकार, जैसे Sortऔर ले सकती है Iterable। आप Mockito.any(Example.class)निश्चित रूप से प्रकार की सुरक्षा चेतावनी के साथ भी उपयोग कर सकते हैं ।

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