2012-06-08 12 views
9

मैं एक परीक्षण का मामला एक java.beans.PropertyDescriptor Mockito का उपयोग कर का उपयोग करता है लिख रहा हूँ, और मैं getPropertyType() के व्यवहार उपहास करने के लिए एक मनमाना Class<?> वस्तु वापस करना चाहते के साथ एक अजीब जेनरिक बढ़त मामले (में मेरी मामला, String.class)। आम तौर पर, मुझे क्या करना होगा कि सिर्फ लागू द्वारा:Mockito.when() और सामान्य प्रकार निष्कर्ष

// we already did an "import static org.mockito.Mockito.*" 
when(mockDescriptor.getPropertyType()).thenReturn(String.class); 

हालांकि, अजीब तरह से, इस संकलन नहीं करता है:

cannot find symbol method thenReturn(java.lang.Class<java.lang.String>) 

लेकिन जब मैं बजाय अनुमान के आधार पर के प्रकार के पैरामीटर निर्दिष्ट:

Mockito.<Class<?>>when(mockDescriptor.getPropertyType()).thenReturn(String.class); 

सबकुछ डरावना डोरी है। संकलक सही ढंग से इस मामले में कब() के रिटर्न प्रकार का अनुमान नहीं लगा सकता है? मुझे ऐसा पहले कभी पैरामीटर निर्दिष्ट नहीं करना पड़ा था।

उत्तर

13

PropertyDescriptor#getPropertyType()Class<?> का ऑब्जेक्ट देता है, जहां ? का अर्थ है "यह एक प्रकार है, लेकिन मुझे नहीं पता कि यह क्या है"। आइए इस प्रकार को "एक्स" कहते हैं। तो when(mockDescriptor.getPropertyType()) एक OngoingStubbing<Class<X>> बनाता है, जिसका तरीका thenReturn(Class<X>) केवल Class<X> की वस्तुओं को स्वीकार कर सकता है। लेकिन संकलक यह नहीं जानता कि यह "एक्स" किस प्रकार है, इसलिए यह आपके बारे में शिकायत करेगा कि प्रकार के Class में गुजर रहा है। मुझे लगता है कि यही कारण है कि संकलक add(...) को Collection<?> पर कॉल करने के बारे में शिकायत करता है।

आप स्पष्ट रूप से when पद्धति पर प्रकार के लिए Class<?> निर्दिष्ट करते हैं, आप यह नहीं कह रहे mockDescriptor.getPropertyType() रिटर्न एक Class<?>, तुम कह रहे हो कि कि when रिटर्न एक OngoingStubbing<Class<?>>। फिर, संकलक यह सुनिश्चित करने के लिए जांच करता है कि आप जो कुछ भी when में गुजर रहे हैं वह Class<?> से मेल खाता है; चूंकि getPropertyType() "Class<X>" देता है, मैंने पहले उल्लेख किया था, यह निश्चित रूप से आपके द्वारा निर्दिष्ट Class<?> से मेल खाता है।

तो मूल रूप से

// the inferred type is Class<"some type"> 
Mockito.when(mockDescriptor.getPropertyType()) 

// the specified type is Class<"any type"> 
Mockito.<Class<?>>when(mockDescriptor.getPropertyType()) 

मेरी आईडीई में, अपने मूल कोड के लिए त्रुटि संदेश

The method thenReturn(Class<capture#1-of ?>) in the type OngoingStubbing<Class<capture#1-of ?>> is not applicable for the arguments (Class<String>) 

है capture#1-of ? "एक्स" मैं ऊपर वर्णित है कि।