1. ホーム
  2. java

[解決済み] 異なるパラメータを持つ複数のメソッドコールを検証する方法

2022-06-01 07:43:24

質問

以下のようなメソッドがあり、動作を確認したいです。

public void methodToTest(Exception e, ActionErrors errors) {
    ...

    errors.add("exception.message", 
            ActionMessageFactory.createErrorMessage(e.toString()));

    errors.add("exception.detail",
            ActionMessageFactory.createErrorMessage(e.getStackTrace()[0].toString()));

    ...
}

私の@Testクラスでは、次のようなことを行って、以下のことを検証したいと思っていました。 errors.add() が "exception.message" で呼び出され、もう一度 "exception.detail" で呼び出されることを検証したかったのです。

verify(errors).add(eq("exception.message"), any(ActionError.class));
verify(errors).add(eq("exception.detail"), any(ActionError.class));

しかし,Mockitoは次のように文句を言う.

Argument(s) are different! Wanted:
actionErrors.add(
    "exception.message",
    <any>
);

Actual invocation has different arguments:
actionErrors.add(
    "exception.detail",
    org.apache.struts.action.ActionError@38063806
);

両方の値をチェックするようにMockitoに指示するにはどうすればよいですか?

どのように解決するのですか?

さらに読み進めていくと、ArgumentCaptors を使ってみることになり、私が望むよりもずっと冗長ではありますが、以下のように動作します。

ArgumentCaptor<String> argument = ArgumentCaptor.forClass(String.class);

verify(errors, atLeastOnce()).add(argument.capture(), any(ActionMessage.class));

List<String> values = argument.getAllValues();

assertTrue(values.contains("exception.message"));
assertTrue(values.contains("exception.detail"));