Mockito - 使用两个不同的参数验证方法被调用两次
Mockito - Verify a method is called twice with two different params
我必须通过以下方法验证行为:
public void saveRequestAndResponse(request, response, additionalInfo) {
// some processing with additionalInfo
dao.save(request);
dao.save(response);
}
在我的测试中class:
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(MainClass.java:200)
-> at com.ws.mainclass.saveRequestAndResponse(MainClass.java:205)
我的 DAO class 中的 save() 方法使用了类型参数 T。
如何使用两种不同的类型(例如请求和响应)验证对 dao.save(type)
方法的两次调用?
你可以这样使用:
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
你要的是in order verification。来自文档:
// 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");
我必须通过以下方法验证行为:
public void saveRequestAndResponse(request, response, additionalInfo) {
// some processing with additionalInfo
dao.save(request);
dao.save(response);
}
在我的测试中class:
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(MainClass.java:200)
-> at com.ws.mainclass.saveRequestAndResponse(MainClass.java:205)
我的 DAO class 中的 save() 方法使用了类型参数 T。
如何使用两种不同的类型(例如请求和响应)验证对 dao.save(type)
方法的两次调用?
你可以这样使用:
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
你要的是in order verification。来自文档:
// 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");