mocking कैसे मॉकोटो में एक ArgumentMatcher नकारना?




mockito (3)

मुझे इसका जवाब मिला। बारी के आसपास है,

Mockito.doReturn(false).when(mock).addAll(AdditionalMatchers‌​.not(Mockito.argThat‌​(new IsListOf2Elements())));

इसका कारण यह है कि AdditionalMatchers‌​.not Mockito.argThat‌ । एक पंजीकृत Mockito.argThat‌ और Mockito.argThat‌ नहीं करता है।

मैंने एक ArgumentMatcher बनाया है,

private class IsListOf2Elements implements ArgumentMatcher<List<String>>{
    @Override
    public boolean matches(List<String> argument) {
        return ((List<String>)argument).size()==2;
    }
}

मैं इस मैच को नकारना चाहता हूं, इसलिए मैच 2 का आकार नहीं है,

Mockito.doReturn(false).when(mock).addAll(Mockito.argThat(AdditionalMatchers.not(new IsListOf2Elements())));

लेकिन यह सही नहीं है। मुझे मिला,

org.mockito.exceptions.misusing.InvalidUseOfMatchersException: 
No matchers found for additional matcher Not(?)
-> at my.test.own.Mockito_aTest.test4e(Mockito_aTest.java:136)

संदर्भ के लिए, जागरूक रहें कि हमाचर्स्ट मैटचर्स और मॉकिटो माट्सर्स बहुत भिन्न तरीके से व्यवहार करते हैं । हैमक्रेस्ट की स्टेटलेस मैचर ऑब्जेक्ट मैच फंक्शन को एक उदाहरण के रूप में दर्शाती हैं, और उनके परिणामों को पलटने के लिए लपेटा जा सकता है; मॉकिटो के "पंजीकृत माट्सर्स" केवल दुष्प्रभावों के माध्यम से काम करते हैं

argThat एक हैक्रेस्ट मैचर को एक मॉकिटू मैचर, हैमक्रेस्ट के CoreMatchers.not एक हामरिकस्ट मैचर और मोकीटो के AdditionalMatchers.not argThat करता। एक मॉकिटू मॅचर (साइड इफेक्ट्स के माध्यम से) को न तोड़ देता है। यह इस कारण का हिस्सा है कि CoreMatchers.not हमेशा एक CoreMatchers.not Matcher<T> , जबकि AddionalMatchers.not । नहीं एक मनमाना T ; यह मॉकिटो राज्य पर काम कर रहा है जिसे आप नहीं देख सकते हैं।

यह आपको निम्न व्यवहार देता है:

// BAD: Don't use AdditionalMatchers to invert a Hamcrest matcher.
doReturn(false).when(mock).addAll(
    Mockito.argThat(AdditionalMatchers.not(new IsListOf2Elements())));

// GOOD: Use AdditionalMatchers to invert a Mockito matcher. (See ericj's answer.)
doReturn(false).when(mock).addAll(
    AdditionalMatchers​.not(Mockito.argThat‌​(new IsListOf2Elements())));

// ALSO GOOD: Use CoreMatchers to invert a Hamcrest matcher. (See troig's answer.)
doReturn(false).when(mock).addAll(
    Mockito.argThat‌​(CoreMatchers.not(new IsListOf2Elements())));

यदि अपवाद जो आप कर रहे हैं वह स्टबर्ड व्यवहार के बारे में है, तो आप विशिष्ट अपवाद के अलावा सामान्य व्यवहार को रोकने के लिए एक अधिक-विशिष्ट ओवरराइड भी उपयोग कर सकते हैं।


ऐसा लगता है कि आप AdditionalMatchers.not मैटचेर्स के रूप में कस्टम मैचर का उपयोग नहीं कर सकते हैं। विधि पैरामीटर नहीं।

हालांकि, आप हमाक्रिस्ट org.hamcrest.CoreMatchers का उपयोग कर सकते हैं। यह काम करना चाहिए:

Mockito.doReturn(false).when(mock).addAll(Mockito.argThat(CoreMatchers.not(new IsListOf2Elements())));

आशा करता हूँ की ये काम करेगा





mockito