2017-01-20 9 views
5

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

when(...).thenReturn(...)を同じ方法でも引数を変えて複数使用する推奨方法はありますか?

また、any() marcherも使用したいと思います。出来ますか?

更新:サンプルコード。

@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 
    } 
} 
+0

これは矛盾します。 'any()'を指定すると、何かを意味しますが、同時に、あなたは?適切なマッチャーを使用してください。 – SpaceTrucker

+0

どうか私にお勧めします。私はパラメータの1つのためのオブジェクトを作成することはできません、それは私がany()を使用する理由ですが、挑戦的に私は動作しません。私は同じことをしたいと言っていました。 –

答えて

8

1つの方法は、1つのthenReturnコールですべての期待される結果を提供するために、あなたの議論を制限しすぎないようにすることができます。 foo

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

コールと:あなたは以下のようにしたいよう

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

あなたはその後、できるだけ多くの結果を提供することで、それを模擬できます

たとえばのは、私は、このメソッドをモックとしたいとしましょういずれのパラメータもそれぞれ「val1」、「val2」を提供し、その後の呼び出しでは「val3」が提供されます。場合


あなたは渡された値を気にしないけど、あなたは現在、しかし3異なるthenReturnで行うように第二引数と一致した答えを提供するために、thenAnswerを使用することができます呼び出しシーケンスに依存する必要はありません。

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) 
     ); 
    } 
); 
+0

@ ZeeshanBilalなぜですか?引数が等しくなければ失敗をしたいですか? –

+0

私のサービスの実装では、パラメータの組み合わせが異なる可能性があります。しかし、私は具体的な議論だけを進めたいと思っています。内部のステップが適切に実行されることを確認する方法だと思います。 –

+0

あなたが現在行っていることよりもうまくいくとは思わない場合 –

0

私は思う:「お勧め」の方法はあなたのために働くものでしょう。それには最小限のコーディング作業が必要です。

あなたのテストを行うために必要なことを行うために必要なTHOSE仕様書を提供しなければなりません。その周りに方法はありません。

実際に使用する引数が気になる場合は、適切に指定する必要があります。あなたが気にしないならば。 any()を使用してください。

+0

また、 'any()' marcherも内部で使いたいと思っています。出来ますか? –

+0

申し訳ありませんが、「内部」とはどういう意味ですか? –

0

適切な方法は、eq()を使用して引数を一致させることですが、そのようにしたくない場合は、複数の戻り値を記録することができます。

when(someService.doSomething(any(SomeParam.class))).thenReturn(
    firstReturnValue, secondReturnValue, thirdReturnValue 
); 

今、最初の呼び出しはthirdValuefirstValuesecondValue及び全ての第2を返します。

関連する問題