Mockito:InvalidUseOfMatchersException


140

DNSチェックを実行するコマンドラインツールがあります。DNSチェックが成功した場合、コマンドはさらにタスクを続行します。Mockitoを使用して、このための単体テストを作成しようとしています。これが私のコードです:

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))

すべての生の値またはすべてのマッチャーを使用する必要がある場合は、1つの生の値と1つのマッチャーを使用します。正しいバージョンは

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

8
なんてばかげている。2番目のパラメーターがエラーを出し続ける理由を分析し続けました。明確にしていただきありがとうございます。私はモッキートが初めてなので、これが初めての出会いです。
devang 2013

32

私は長い間同じ問題を抱えていました。Matchersと値を組み合わせる必要がしばしばありましたが、最近までMockitoでそれを行うことができませんでした!!この投稿がかなり古くても、誰かの役に立つことを期待して、ここに解決策を置きました。

MockitoでマッチャーAND値を一緒に使用することは明らかに不可能ですが、変数の比較を受け入れるマッチャーがあった場合はどうなりますか?それは問題を解決します...そして実際にはあります:eq

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

この例では、「metas」は既存の値のリストです


5
驚くばかり。 org.mockito.Mockito.eq()
javaPlease42

4
適切なインポートはorg.mockito.ArgumentMatchers.eq()になります
sam

15

Mockitoは「最終」メソッドのモックをサポートしていません(現在)。同じInvalidUseOfMatchersExceptionです。

私にとっての解決策は、「最終」である必要のないメソッドの部分を、個別のアクセス可能なオーバーライド可能なメソッドに配置することでした。

確認Mockito APIをご利用の場合のために。


これは、なぜ私のkotlinコードでエラーが発生するのかを理解するのに役立ち、kotlinのすべてのメソッドは最終的なものです!
sorry_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メソッドをモックしようとしたため、例外が発生しました。メソッドのアクセスレベルをからに変更するpackageprotected、例外がなくなりました。たとえば、Javaクラスの下、

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

モックメカニズム(サブクラス化)が機能String getName(String id)するように、メソッドは最低 protectedレベルである必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.