Mockito - 验证一个方法被两个不同的参数调用两次

Red*_*unt 4 java mockito

我必须通过以下方法验证行为:

public void saveRequestAndResponse(request, response, additionalInfo) {
    // some processing with additionalInfo
    dao.save(request);
    dao.save(response);
}
Run Code Online (Sandbox Code Playgroud)

在我的测试课中:

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());
Run Code Online (Sandbox Code Playgroud)

以及 DAO 方法:

@Transactional
Public <T> T save(final T it) {
    saveOrUpdate(it);
}
Run Code Online (Sandbox Code Playgroud)

收到错误:

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)
Run Code Online (Sandbox Code Playgroud)

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

如何验证dao.save(type)对具有两种不同类型(例如请求和响应)的方法的两次调用?

小智 5

你可以使用这样的东西:

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
Run Code Online (Sandbox Code Playgroud)