2013-04-11 10 views
40

का उपयोग करके वाइल्डकार्ड के साथ जेनेरिक लौटने वाली एक विधि का मज़ाक उड़ाते हुए मैं मॉकिटो 1.9.5 का उपयोग कर रहा हूं।मॉकिटो

"The method thenReturn(List<capture#1-of ? extends MyInterface>) in the type 
OngoingStubbing<List<capture#1-of ? extends MyInterface>> is not applicable for the arguments 
(List<MyInterface>)" 

हालांकि, जब मैं mockito की thenAnswer विधि का उपयोग करें, मैं नहीं त्रुटि मिलती है:

public class ClassA { 

public List<? extends MyInterface> getMyInterfaces() { 
    return null; 
} 

public static void testMock() { 
    List<MyInterface> interfaces = new ArrayList<>(); 
    ClassA classAMock = mock(ClassA.class); 
    when(classAMock.getMyInterfaces()).thenReturn(interfaces);  
} 

मैं thenReturn(interfaces) के लिए एक संकलन त्रुटि कह मिलती है: मैं निम्नलिखित कोड है। क्या कोई मुझे बता सकता है कि क्या हो रहा है? जब मैं thenReturn विधि का उपयोग करता हूं तो मुझे त्रुटि क्यों मिलती है? क्या इस समस्या को हल करने का कोई अन्य तरीका है जब ClassA किसी तृतीय पक्ष द्वारा प्रदान किया जाता है और संशोधित नहीं किया जा सकता है?

+0

आपके पास 'getMyInterfaces' की वापसी प्रकार में वाइल्डकार्ड नहीं होना चाहिए। यह एक अच्छा अभ्यास नहीं है, क्योंकि उस एपीआई के ग्राहकों को वाइल्डकार्ड से निपटना है जहां उन्हें कुछ भी पता नहीं है। – SpaceTrucker

+1

मैं इस एपीआई को नियंत्रित नहीं करता हूं। यह एक तीसरी पार्टी द्वारा दिया जाता है। – user1504992

+5

@ स्पेसट्रकर मुझे लगता है कि 'सूची <जैसे वापसी प्रकार है? MyInterface बढ़ाता है> 'करने के लिए एक पूरी तरह समझदार बात है। इसका मतलब है कि आप (विधि कॉलर के रूप में) सूची में से 'MyInterface' ऑब्जेक्ट्स प्राप्त कर सकते हैं, लेकिन आप इसमें कुछ भी नहीं डाल सकते हैं। –

उत्तर

49

संपादित करें: मॉकिटो 1.10.x से शुरू, कक्षा में एम्बेडेड जेनेरिक प्रकार अब गॉक स्टब्स के लिए मॉकिटो द्वारा उपयोग किए जाते हैं। अर्थात।

public interface A<T extends Observer & Comparable<? super T>> { 
    List<? extends B> bList(); 
    T observer(); 
} 

B b = deep_stubbed.bList().iterator().next(); // returns a mock of B ; mockito remebers that A returns a List of B 
Observer o = deep_stubbed.observer(); // mockito can find that T super type is Observer 
Comparable<? super T> c = deep_stubbed.observer(); // or that T implements Comparable 

Mockito कि संकलक एम्बेड करता है प्रकार की जानकारी प्राप्त करने के लिए अपने सबसे अच्छे रूप की कोशिश करता है, लेकिन जब विलोपन लागू होता है, mockito कुछ नहीं कर सकते लेकिन Object की एक नकली वापसी।


मूल: ठीक है कि Mockito साथ की तुलना में जेनरिक के साथ एक मुद्दे के अधिक है। जेनेरिक के लिए, आपको एंजेलिका लैंगर पर लिखा जाना चाहिए। और वर्तमान विषय के लिए, यानी वाइल्डकार्ड, इसे section पढ़ें।

doReturn(interfaces).when(classAMock).getMyInterfaces(); 

या BDD उपनाम के साथ:

लेकिन छोटे के लिए, क्या आप इस्तेमाल कर सकते हैं Mockito के अन्य वाक्य रचना आपकी वर्तमान स्थिति के साथ मदद करने के लिए है

willReturn(interfaces).given(classAMock).getMyInterfaces(); 

फिर भी, आप लिख सकते हैं रैपर जो अधिक सामान्य मित्रवत हैं। इससे भविष्य में डेवलपर्स को एक ही तृतीय पक्ष एपीआई के साथ काम करने में मदद मिलेगी।


एक साइड नोट के रूप में: आपको उस प्रकार का मिक्स नहीं करना चाहिए जो आपके पास नहीं है, इससे कई त्रुटियां और समस्याएं हो सकती हैं। इसके बजाय आपको कुछ रैपर होना चाहिए। उदाहरण के लिए डीएओ और भंडार इस तरह के विचार का प्रतिनिधित्व करते हैं, कोई डीएओ या रिपोजिटरी इंटरफ़ेस का मज़ाक उड़ाएगा, लेकिन जेडीबीसी/जेपीए/हाइबरनेट सामग्री नहीं। कई ब्लॉग पोस्ट के बारे में कर रहे हैं:

+0

अंतर्दृष्टि लिंक के लिए भी धन्यवाद! – thSoft

+0

'doReturn' वाक्यविन्यास टाइप-सुरक्षित नहीं है, हालांकि (आप कुछ भी वापस कर सकते हैं, न केवल कुछ की सूची)। (हालांकि आप इस सेटअप के दौरान अभी भी एक अपवाद प्राप्त करते हैं - लेकिन यदि आप एक अलग तरह की सूची में नहीं डालते हैं।) –

+0

@ PaŭloEbermann वास्तव में, यह प्रकार के क्षरण के कारण है। इस मामले में चेकटाइम पर चेक किया जाता है। अन्य रूप संकलित समय पर चेक किया जा सकता है। – Brice

36

एक और (कम पठनीय यद्यपि) समाधान के स्थिर विधि कॉल अर्हता प्राप्त करने के लिए है वाइल्डकार्ड को बांधने के लिए when:

Mockito.<List<? extends MyInterface>>when(classAMock.getMyInterfaces()).thenReturn(interfaces); 
+8

यह काला जादू है, लेकिन यह पूरी तरह से काम करता है। धन्यवाद –

+0

यह एकमात्र ऐसा है जो मेरे लिए काम करता है। – gladed