[英]How to set up Mockito mock to use same answer for multiple different method calls
[英]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
封装的when
和verify
呼叫中使用它:
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.