मॉकिटो: InvalidUseOfMatchersException


141

मेरे पास कमांड लाइन टूल है जो DNS चेक करता है। यदि DNS चेक सफल होता है, तो कमांड आगे के कार्यों के साथ आगे बढ़ता है। मैं मॉकिटो का उपयोग करके इसके लिए इकाई परीक्षण लिखने की कोशिश कर रहा हूं। यहाँ मेरा कोड है:

public class Command() {
    // ....
    void runCommand() {
        // ..
        dnsCheck(hostname, new InetAddressFactory());
        // ..
        // do other stuff after dnsCheck
    }

    void dnsCheck(String hostname, InetAddressFactory factory) {
        // calls to verify hostname
    }
}

मैं InetAddressFactory का उपयोग करके InetAddressवर्ग के स्थैतिक कार्यान्वयन का मजाक उड़ा रहा हूं । यहाँ कारखाने के लिए कोड है:

public class InetAddressFactory {
    public InetAddress getByName(String host) throws UnknownHostException {
        return InetAddress.getByName(host);
    }
}

यहाँ मेरा यूनिट टेस्ट केस है:

@RunWith(MockitoJUnitRunner.class)
public class CmdTest {

    // many functional tests for dnsCheck

    // here's the piece of code that is failing
    // in this test I want to test the rest of the code (i.e. after dnsCheck)
    @Test
    void testPostDnsCheck() {
        final Cmd cmd = spy(new Cmd());

        // this line does not work, and it throws the exception below:
        // tried using (InetAddressFactory) anyObject()
        doNothing().when(cmd).dnsCheck(HOST, any(InetAddressFactory.class));
        cmd.runCommand();
    }
}

testPostDnsCheck()परीक्षण चलाने पर अपवाद :

org.mockito.exceptions.misusing.InvalidUseOfMatchersException: 
Invalid use of argument matchers!
2 matchers expected, 1 recorded.
This exception may occur if matchers are combined with raw values:
    //incorrect:
    someMethod(anyObject(), "raw String");
When using matchers, all arguments have to be provided by matchers.
For example:
    //correct:
    someMethod(anyObject(), eq("String by matcher"));

इसे हल करने के बारे में कोई इनपुट?

जवाबों:


283

त्रुटि संदेश समाधान की रूपरेखा देता है। रेखा

doNothing().when(cmd).dnsCheck(HOST, any(InetAddressFactory.class))

एक कच्चे मान और एक माचिस का उपयोग करता है, जब सभी कच्चे मूल्यों या सभी माचिस का उपयोग करना आवश्यक होता है। एक सही संस्करण पढ़ सकता है

doNothing().when(cmd).dnsCheck(eq(HOST), any(InetAddressFactory.class))

8
मैं कितना बेवकूफ़ हूँ। मैं विश्लेषण करता रहा कि 2 पैरामीटर मुझे त्रुटि देने पर क्यों लगे रहे। स्पष्टीकरण देने के लिए धन्यवाद। मैं मॉकिटो के लिए बहुत नया हूं, यह मेरा पहला मुकाबला है।
देवांग

32

मुझे लंबे समय से एक ही समस्या थी, मुझे अक्सर मैचर्स और मूल्यों को मिलाने की जरूरत थी और मैं कभी भी मॉकिटो के साथ ऐसा करने में कामयाब नहीं हुआ .... हाल ही में! मैं यहाँ समाधान डाल रहा हूँ उम्मीद है कि यह किसी की मदद करेगा भले ही यह पद काफी पुराना हो।

मॉकिटो में माचिस और मान का एक साथ उपयोग करना स्पष्ट रूप से संभव नहीं है, लेकिन क्या होगा यदि एक चर की तुलना करने के लिए एक माचिस स्वीकार कर रहा है? यह समस्या को हल करेगा ... और वास्तव में वहाँ है: eq

when(recommendedAccessor.searchRecommendedHolidaysProduct(eq(metas), any(List.class), any(HotelsBoardBasisType.class), any(Config.class)))
            .thenReturn(recommendedResults);

इस उदाहरण में 'मेटास' मूल्यों की मौजूदा सूची है


5
बहुत बढ़िया। org.mockito.Mockito.eq()
javaPl4242

4
उचित आयात अब ..mockito.ArgumentMatchers.eq ()
sam

15

यह भविष्य में कुछ मदद कर सकता है: मॉकिटो 'अंतिम' तरीकों (अभी) का मजाक उड़ाने का समर्थन नहीं करता है। इसने मुझे वही दिया InvalidUseOfMatchersException

मेरे लिए इसका तरीका यह था कि मैं उस विधि का हिस्सा रखूं जो अलग, सुलभ और अधिक उपयोगी विधि में 'अंतिम' न हो।

अपने उपयोग के मामले के लिए मॉकिटो एपीआई की समीक्षा करें ।


यह पता लगाने में मदद मिली कि मेरा कोटलिन कोड मुझे त्रुटि क्यों देगा, कोटलिन में सभी तरीके अंतिम हैं!
क्षमा करें_I_wont

0

सभी मैचर्स का उपयोग करने के बावजूद, मुझे एक ही मुद्दा मिल रहा था:

"org.mockito.exceptions.misusing.InvalidUseOfMatchersException: 
Invalid use of argument matchers!
1 matchers expected, 3 recorded:"

मुझे यह पता लगाने में थोड़ा समय लगा कि जिस विधि का मैं मजाक करने की कोशिश कर रहा था वह एक वर्ग की स्थैतिक विधि थी (जैसे Xyz.class) जिसमें केवल स्थैतिक विधि होती है और मैं निम्नलिखित पंक्ति लिखना भूल गया:

PowerMockito.mockStatic(Xyz.class);

हो सकता है कि यह दूसरों की मदद करे क्योंकि यह मुद्दे का कारण भी हो सकता है।


0

मेरे मामले के लिए, अपवाद को उठाया गया था क्योंकि मैंने एक package-accessविधि का मजाक उड़ाने की कोशिश की थी । जब मैं से विधि पहुंच का स्तर बदल packageकरने के लिए protectedअपवाद चला गया। जैसे जावा क्लास के अंदर,

public class Foo {
    String getName(String id) {
        return mMap.get(id);
    }
}

विधि String getName(String id)का स्तर कम से कम होना चाहिए protectedताकि मॉकिंग मैकेनिज्म (सब-क्लासिंग) काम कर सके।

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