2011-03-28 15 views
39

के साथ पैरामीटर के रूप में एक विधि को दबाकर एक सामान्य विधि है जो कक्षा को पैरामीटर के रूप में लेती है और मुझे इसे मॉकिटो के साथ चिपकाने में समस्याएं होती हैं। विधि इस प्रकार है:क्लाउड <T> लेआउट के रूप में क्लाउड

public <U extends Enum<U> & Error, T extends ServiceResponse<U>> T validate(
    Object target, Validator validator, Class<T> responseClass, 
    Class<U> errorEnum); 

यह भगवान भयंकर है, कम से कम मेरे लिए ... मैं इसे बिना जीवित है, लेकिन खुशी से इसे इस्तेमाल करता है कोड बेस के बाकी कल्पना कर सकता ...

मैं था मेरे यूनिट टेस्ट में, एक नई खाली वस्तु वापस करने के लिए इस विधि को दबाएं। लेकिन मैं इसे मॉकिटो के साथ कैसे करूं? मैंने कोशिश की:

लेकिन जब से मैं मिश्रण कर रहा हूँ और matchers और कच्चे मूल्यों से मेल खाते, मैं "org.mockito.exceptions.misusing.InvalidUseOfMatchersException: तर्क matchers का अमान्य उपयोग"

उत्तर

71

समस्या यह है कि आप तर्कसंगत मैकर्स और वास्तविक तर्कों को मॉक किए गए कॉल में मिश्रित नहीं कर सकते हैं। समानता मिलान के लिए eq() तर्क मिलान के उपयोग

when(serviceValidatorStub.validate(
    any(), 
    isA(UserCommentRequestValidator.class), 
    eq(UserCommentResponse.class), 
    eq(UserCommentError.class)) 
).thenReturn(new UserCommentResponse()); 

सूचना: तो, बल्कि यह करते हैं।

देखें: https://static.javadoc.io/org.mockito/mockito-core/1.10.19/org/mockito/Matchers.html#eq(T)

इसके अलावा, आप Class<?> प्रकार के लिए same() तर्क मिलान इस्तेमाल कर सकते हैं - यह एक ही पहचान से मेल खाता है, == जावा ऑपरेटर की तरह।

+0

एक आकर्षण, बहुत अच्छा जवाब की तरह काम किया। अच्छी तरह से समझाया –

+0

शक्तिशाली आभारी! –

+0

दरअसल। लेकिन मुझे आश्चर्य है कि उपयोगकर्ताओं को "तर्क मैचों और वास्तविक तर्कों को मिश्रण करने" की अनुमति देने के लिए मॉकिटो को बेहतर किया जा सकता है; अगर यूनिटिल मॉक इसे कर सकता है, तो यह तकनीकी रूप से संभव होना चाहिए। –

2

बस एक ही धागे को पूरा करने के लिए, यदि कोई ऐसी विधि को रोकना चाहता है जो क्लास को तर्क के रूप में लेता है, लेकिन इस प्रकार की परवाह नहीं है, या उसी तरह से स्टब किए जाने के लिए कई प्रकार की आवश्यकता है, तो यहां है एक और समाधान:

private class AnyClassMatcher extends ArgumentMatcher<Class<?>> { 

    @Override 
    public boolean matches(final Object argument) { 
     // We always return true, because we want to acknowledge all class types 
     return true; 
    } 

} 

private Class<?> anyClass() { 
    return Mockito.argThat(new AnyClassMatcher()); 
} 

और फिर

Mockito.when(mock.doIt(this.anyClass())).thenCallRealMethod(); 
0

अच्छा एक @Ash कहते हैं। मैंने नीचे तैयार करने के लिए अपने जेनेरिक क्लास मैचर का इस्तेमाल किया। यह है कि अगर हम एक विशेष प्रकार की नकली तैयारी करना चाहते हैं के लिए इस्तेमाल किया जा सकता है (नहीं उदाहरण)

private Class<StreamSource> streamSourceClass() { 
    return Mockito.argThat(new ArgumentMatcher<Class<StreamSource>>() { 

     @Override 
     public boolean matches(Object argument) { 
      // TODO Auto-generated method stub 
      return false; 
     } 
    }); 
} 

उपयोग:।

Mockito.when(restTemplate.getForObject(Mockito.anyString(), 
      **streamSourceClass(),** 
      Mockito.anyObject)); 
संबंधित मुद्दे