繁体   English   中英

如何使用Mockito测试对同一方法的两个不同调用,每个调用返回不同的响应?

[英]How can I use Mockito to test two different calls to the same method that returns a different response for each call?

使用Mockito,我需要测试在同一事务中两次被调用并每次返回不同值的方法。

我有两个测试-每个通话一个。

第一个是:

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

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

而第二则读到:

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

第二次测试通过,因为它找到了第二个响应,但是第一个失败,因为它也找到了第二个响应。 如何获得第一个测试,仅查看该方法的第一个响应? 还是有assertThat的形式可以让我立即检查两个响应?

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的ArgumentMatcher类该类在Mockito 1.x中扩展了Hamcrest的Matcher,但在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呼叫中使用它:

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

有关使用哪个argThat以及为什么需要它的更多信息,请参见: Mockito匹配器如何工作?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM