2016-07-15 8 views
0

Mockitoを使用すると、同じトランザクションで2回呼び出され、毎回異なる値を返すメソッドをテストする必要があります。どのようにしてMockitoを使用して、同じ呼び出しに対して異なる応答を返す同じメソッドへの2つの異なる呼び出しをテストできますか?

私は2回のテストを行います.1回につき1回です。

最初である:

verify(mockAppender, times(2)).doAppend(logEventArgumentCaptor.capture()); 

assertThat(logEventArgumentCaptor.getValue().getMessage(), containsString("Error response: " + RESPONSE)); 

2読み取りながら:

verify(mockAppender, times(2)).doAppend(logEventArgumentCaptor.capture()); 

assertThat(logEventArgumentCaptor.getValue().getMessage(), containsString("Request body: " + BODY)); 

を試験されるコードの読み取り:

if (!statusCode.is2xxSuccessful()) { 
    LOG.error("Error response: "+response); 
    LOG.error("Request body: "+bodyString); 
} 

それが第2の応答を見つけるため、第2テストに合格しかし、第1の応答は第2の応答をも見つけるので失敗する。メソッドからの最初の応答のみを調べるための最初のテストを取得するにはどうすればよいですか?あるいは、私はすぐに両方の応答をチェックすることができるassertThatのフォームがありますか?

答えて

0

ArgumentCaptorは、一致するすべてのキャプチャのリストを返す、getAllValues()呼び出しをサポートしています。これを使用して両方のメッセージを確認することができます。

verify(mockAppender, times(2)).doAppend(logEventArgumentCaptor.capture()); 

assertThat(logEventArgumentCaptor.getAllValues().get(0).getMessage(), 
    containsString("Error response: " + RESPONSE)); 
assertThat(logEventArgumentCaptor.getAllValues().get(1).getMessage(), 
    containsString("Request body: " + BODY)); 

しかし、一般的な場合には、これはあなたのためのメッセージをチェックしHamcrest(スタイル)マッチャーを書き込むための絶好の機会です。ここではMockito's ArgumentMatcher classを使用しています。これは、HamiltonのMatcherをMockito 1.xで拡張しましたが、Mockito 2.0の依存関係を解消します。

public class LogEventContaining implements ArgumentMatcher<LogEvent> { 
    private final String searchText; 

    public LogEventContaining(String searchText) { 
    this.searchText = searchText; 
    } 

    @Override public boolean matches(LogEvent logEvent) { 
    // You could also use your Hamcrest matcher here. 
    return logEvent.getMessage().indexOf(searchText) >= 0; 
    } 

    @Override public String toString() { 
    return String.format("log message containing '%s'", searchText); 
    } 
} 

// Per Mockito/Hamcrest style. This could go anywhere. 
public static ArgumentMatcher<LogEvent> isALogEventContaining(String searchText) { 
    return new LogEventContaining(searchText); 
} 

今、あなたは、アダプタargThatでラップの両方whenverify呼び出し、それを使用することができます:あなたはそれを必要とする理由を知る、使うとするためにどのargThatの詳細については

verify(mockAppender) 
    .doAppend(argThat(isALogEventContaining("Error response: " + RESPONSE))); 
verify(mockAppender, never()) 
    .doAppend(argThat(isALogEventContaining("Request body: " + BODY))); 
when(mockAppender.doAppend(argThat(isALogEventContaining("Foo")))) 
    .thenThrow(new RuntimeException("Log not available")); 

How do Mockito matchers work?

+0

素晴らしい答え。それはいつもラインが緑色になるのを見るのはスリルです。ありがとう。 – Patrick

+0

@Patrick喜んで助けてください!この質問に満足していると感じたら、チェックボックスをクリックして[回答を受け入れる](http://stackoverflow.com/help/accepted-answer)をクリックします。 StackOverflowへようこそ。あなたのプロジェクトには幸運です! –

関連する問題