我有一些通用的接口可以模拟:
public interface RequestHandler {
public Object handle(Object o);
}
并且该模拟接口应在单个测试中处理不同的请求。
when(mock.handle(isA(ARequest.class))).thenReturn(new AResponse());
when(mock.handle(isA(BRequest.class))).thenReturn(new BResponse());
但是我想捕获传递的
BRequest
实例以检查其所有参数。有可能吗?现在,我仅看到一种解决方案:构建
ArgumentMatcher
的庞大扩展。但是,我不喜欢这样,因为我不会看到AssertionError
消息。 最佳答案
记住:尽管匹配器既用于存根又用于验证,但是ArgumentCaptor仅用于验证。这很简单:
ArgumentCaptor<BRequest> bCaptor = ArgumentCaptor.for(BRequest.class);
when(mock.handle(isA(BRequest.class))).thenReturn(new BResponse());
systemUnderTest.handle(createBRequest());
verify(mock).handle(bCaptor.capture());
BRequest bRequest = bCaptor.getValue();
// your assertions here
但是请注意,这也意味着您不能使用ArgumentCaptor选择响应。那是部分模拟或答案出现的地方:
when(mock.handle(any())).thenAnswer(new Answer<Object>() {
@Override public Object answer(InvocationOnMock invocation) {
Object argument = invocation.getArguments()[0];
// your assertions here, and you can return your desired value
}
});
如果您选择一个ArgumentMatcher,它可能不会那么可怕,尤其是如果您跳过工厂方法并让Mockito的脱骆驼壳作为您的描述:
public static class IsAnAppropriateBRequest extends ArgumentMatcher<Object> {
@Override public boolean matches(Object object) {
if !(object instanceof BRequest) {
return false;
}
BRequest bRequest = (BRequest) object;
// your assertions here
}
}
when(mock.handle(argThat(new IsAnAppropriateBRequest())))
.thenReturn(new BResponse());
关于java - 在ArgumentMatcher之后如何使用ArgumentCaptor?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31923766/