異なるパラメータで同じメソッドをモックする 質問する

異なるパラメータで同じメソッドをモックする 質問する

私はビジネス サービスをテストするために mockito を使用していますが、これは私がモックしたいユーティリティを使用しています。各サービス メソッドには、異なる引数を持つユーティリティの呼び出しが少なくとも 2 ~ 3 回あります。

when(...).thenReturn(...)同じメソッドで異なる引数を複数使用する推奨方法はありますか?

内部でもマーチャーを使いたいのですがany()、可能ですか?

更新: サンプルコード。

@Test
public void myTest() {
  when(service.foo(any(), new ARequest(1, "A"))).thenReturn(new AResponse(1, "passed"));
  when(service.foo(any(), new ARequest(2, "2A"))).thenReturn(new AResponse(2, "passed"));
  when(service.foo(any(), new BRequest(1, "B"))).thenReturn(new BResponse(112, "passed"));

  c.execute();
}

public class ClassUnderTest {
  Service service = new Service();
  public void execute() {
    AResponse ar = (AResponse) service.foo("A1", new ARequest(1, "A"));
    AResponse ar2 = (AResponse) service.foo("A2", new ARequest(2, "2A"));
    BResponse br = (BResponse) service.foo("B1", new BRequest(1, "B"));
  }
}

public class Service {
  public Object foo(String firstArgument, Object obj) {
    return null; //return something
  }
}

ベストアンサー1

1 つの方法としては、1 回の呼び出しで期待される結果をすべて提供するために、引数を制限しすぎないようにすることが考えられますthenReturn

たとえば、次のメソッドをモックするとします。

public String foo(String firstArgument, Object obj) {
    return "Something";
}

次に、以下のように、必要な数だけ結果を提供してモックすることができます。

// Mock the call of foo of any String to provide 3 results
when(mock.foo(anyString(), anyObject())).thenReturn("val1", "val2", "val3");

任意のパラメータを使用してを呼び出すと、それぞれ「 」、「 」fooが提供され、後続の呼び出しでは「」が提供されます。val1val2val3


渡された値には関心があるが、呼び出しシーケンスに依存したくない場合は、 を使用して、thenAnswer現在と同じように 2 番目の引数に一致する回答を 3 つの異なる で提供できますthenReturn。 メソッドをオーバーライドしたと仮定しますequals(Object o)

when(mock.foo(anyString(), anyObject())).thenAnswer(
    invocation -> {
        Object argument = invocation.getArguments()[1];
        if (argument.equals(new ARequest(1, "A"))) {
            return new AResponse(1, "passed");
        } else if (argument.equals(new ARequest(2, "2A"))) {
            return new AResponse(2, "passed");
        } else if (argument.equals(new BRequest(1, "B"))) {
            return new BResponse(112, "passed");
        }
        throw new InvalidUseOfMatchersException(
            String.format("Argument %s does not match", argument)
        );
    }
);

または、単に、メソッドanyStringとメソッドeqを引数マーチャーとして使用します。メソッドをオーバーライドしたと仮定しますequals(Object o)

when(service.foo(anyString(), eq(new ARequest(1, "A"))))
    .thenReturn(new AResponse(1, "passed"));
when(service.foo(anyString(), eq(new ARequest(2, "2A"))))
    .thenReturn(new AResponse(2, "passed"));
when(service.foo(anyString(), eq(new BRequest(1, "B"))))
    .thenReturn(new BResponse(112, "passed"));

おすすめ記事