মকিতো: অবৈধ ইউসঅফ ম্যাথার্স এক্সসেপশন


141

আমার কাছে একটি কমান্ড লাইন সরঞ্জাম রয়েছে যা একটি ডিএনএস চেক করে। যদি ডিএনএস চেক সফল হয়, কমান্ডটি আরও কাজ করে এগিয়ে যায়। আমি মকিতো ব্যবহার করে এর জন্য ইউনিট পরীক্ষা লেখার চেষ্টা করছি। আমার কোডটি এখানে:

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

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

আমি 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()
javaPLAY42

4
যথাযথ আমদানি এখন org.mockito.ArgumentMatchers.eq ()
সাম

15

এটি ভবিষ্যতে কাউকে সহায়তা করতে পারে: মকিতো 'চূড়ান্ত' পদ্ধতিগুলির উপহাস করার পক্ষে সমর্থন করে না (এখনই)। এটা আমাকে একই দিয়েছে InvalidUseOfMatchersException

আমার জন্য সমাধানটি ছিল সেই পদ্ধতির যে অংশটি 'চূড়ান্ত' হতে হবে না তার একটি পৃথক, অ্যাক্সেসযোগ্য এবং অধিকযোগ্য পদ্ধতিতে।

আপনার ব্যবহারের ক্ষেত্রে মকিতো এপিআই পর্যালোচনা করুন ।


এটি আমার কোটলিন কোড আমাকে ত্রুটি কেন দেবে তা নির্ধারণে সহায়তা করেছিল, কোটলিনের সমস্ত পদ্ধতি চূড়ান্ত!
দুঃখিত_আমি_আর

0

সমস্ত ম্যাথার ব্যবহার করেও, আমি একই সমস্যা পেয়েছি:

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

এটি নির্ধারণ করতে আমার একটু সময় লেগেছে যে আমি যে পদ্ধতিটি উপহাস করার চেষ্টা করছিলাম সেটি হ'ল একটি ক্লাসের স্ট্যাটিক পদ্ধতি (যা জাইজক্লাস বলুন) কেবল স্থির পদ্ধতি রয়েছে এবং আমি নিম্নলিখিত লাইনটি লিখতে ভুলে গেছি:

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 স্তর যাতে বিদ্রূপকারী প্রক্রিয়া (উপ-classing) কাজ করতে পারেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.