Mockito - 验证方法被调用了两次,且参数不同

3

我需要验证以下方法的行为:

public void saveRequestAndResponse(request, response, additionalInfo) {
    // some processing with additionalInfo
    dao.save(request);
    dao.save(response);
}

在我的测试类中:

ArgumentCaptor<com.ws.Request> request = ArgumentCaptor.forClass(com.ws.Request.class);
Mockito.verify(dao, Mockito.times(1)).save(request.capture());

ArgumentCaptor<com.ws.Response> response = ArgumentCaptor.forClass(com.ws.Response.class);
Mockito.verify(dao, Mockito.times(1)).save(response.capture());

还有DAO方法:

@Transactional
Public <T> T save(final T it) {
    saveOrUpdate(it);
}

收到的错误信息:

org.mockito.exceptions.verification.TooManyActualInvocations: 
dao.save(<Capturing argument>);
Wanted 1 time:
-> at com.ws.testclass(TestClass.java:296)
But was 2 times:
-> at com.ws.mainclass.lambda$saveRequestAndResponse$78(MainClass.java:200)
-> at com.ws.mainclass.saveRequestAndResponse(MainClass.java:205)

我的DAO类中的save()方法使用了类型参数T。

如何验证对dao.save(type)方法的两次调用,其中type是不同的类型,例如Request和Response?


你好,你需要每个对象(请求,响应)中的值吗?因为如果不是这种情况,你可以使用Mockito.verify(dao, Mockito.times(2)).save(Mockito.any()); - Marco
@MarcoPens 没错,我想在每次调用时验证这个值:save(request)和save(response)。 - Harish
2个回答

3
您可以像这样使用:
ArgumentCaptor<Object> parameters = ArgumentCaptor.forClass(Object.class);
Mockito.verify(dao, Mockito.times(2)).save(parameters.capture());
List<Object> values= parameters.getAllValues();
com.ws.Request req= (com.ws.Request) values.get(0);
com.ws.Response res= (com.ws.Respons) values.get(1);
//Validations

这可能有效,但它真正混淆了意图,而且滥用了捕获的本意。 - Daniel

1
您希望的是订单验证。根据文档描述:
// A. Single mock whose methods must be invoked in a particular order
 List singleMock = mock(List.class);

 //using a single mock
 singleMock.add("was added first");
 singleMock.add("was added second");

 //create an inOrder verifier for a single mock
 InOrder inOrder = inOrder(singleMock);

 //following will make sure that add is first called with "was added first, then with "was added second"
 inOrder.verify(singleMock).add("was added first");
 inOrder.verify(singleMock).add("was added second");

这是另一种方法,如果您需要使用对象来执行此操作,则需要实现hashCodeequals方法。如果您需要检查对象中的特定内容,则不是那么简单。 - Marco

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接