我有一些通用的接口可以模拟:

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/

10-10 07:05