166

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

これを解決する方法について何か入力はありますか?

4

7 に答える 7

336

エラーメッセージは解決策の概要を示しています。この線

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

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

doNothing().when(cmd).dnsCheck(eq(HOST), any(InetAddressFactory.class))
于 2013-02-13T03:03:31.933 に答える
38

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

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

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

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

于 2015-06-01T12:55:17.980 に答える
20

将来的には役立つかもしれません。Mockitoは「final」メソッドのモックをサポートしていません(現在)。それは私に同じことを与えましたInvalidUseOfMatchersException

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

ユースケースに合わせてMockitoAPIを確認してください。

于 2017-01-26T13:40:18.847 に答える
1

私の場合、package-accessメソッドをモックしようとしたために例外が発生しました。メソッドのアクセスレベルをからに変更するpackageprotected、例外がなくなりました。たとえば、Javaクラスの下にあります。

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

モッキングメカニズム(サブクラス化)が機能できるように、メソッドString getName(String id)は少なくともレベルである必要があります。 protected

于 2019-08-01T05:36:23.863 に答える
0

すべてのマッチャーを使用しているにもかかわらず、同じ問題が発生していました。

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

私がモックしようとしたメソッドが静的メソッドのみを含むクラス(たとえばXyz.class)の静的メソッドであり、次の行を書くのを忘れたことを理解するのに少し時間がかかりました。

PowerMockito.mockStatic(Xyz.class);

それは問題の原因でもあるかもしれないので、それは他の人を助けるかもしれません。

于 2018-06-22T09:07:14.097 に答える
0

誰かに役立つかもしれません。モックされたメソッドは、モックされたクラスである必要があります。mock(MyService.class)

于 2021-01-25T11:22:15.173 に答える
-1

Mockito.anyXXXX()は使用しないでください。同じタイプのメソッドパラメータに値を直接渡します。例:

A expected = new A(10);

String firstId = "10w";
String secondId = "20s";
String product = "Test";
String type = "type2";
Mockito.when(service.getTestData(firstId, secondId, product,type)).thenReturn(expected);

public class A{
   int a ;
   public A(int a) {
      this.a = a;
   }
}
于 2020-10-15T15:55:43.870 に答える