我有一个带有方法的服务类,它多次调用ie.repository.save()
。我正在测试上述服务方法。是否可以在x
时间捕获save()
方法调用并获取其传递/返回的参数?
示例:
class MyService{
void doSomething(){
myRepository.save(obj1);
// some code;
myRepository.save(obj2);
}
}
我正在测试doSomething
方法,希望获得第一个保存方法的结果和/或传递的参数。我正在使用mockito。
与前面的答案类似,我假设myRepository
的类型为MyRepository
,被模拟并传递给myService
。您可以使用ArgumentCaptor
:捕获并检查传递给方法save()
的参数
@Test
public void testDoSomething() {
// Given
MyRepository myRepository = Mockito.mock(MyRepository.class);
MyService myService = new MyService(myRepository);
// When
myService.doSomething();
// Then
ArgumentCaptor<Object> captor = ArgumentCaptor.forClass(Object.class);
Mockito.verify(myRepository, Mockito.times(2)).save(captor.capture());
Assert.assertEquals(obj1, captor.getAllValues().get(0)); // First invocation of save()
Assert.assertEquals(obj2, captor.getAllValues().get(1)); // Second invocation of save()
}
我假设您将myRepository
作为对MyService
的依赖项传递。在这种情况下,您可以在测试中创建它的mock,并通过该mock。
您可以调用Mockito.doAnswer(...).when(myRepository).save(any())
并传递一个Answer
来处理模拟myRepository
的save
调用。如果需要执行myRepository
对象的实际方法,可以向链中添加一个doCallRealMethod()
。
传递给Answer
的参数就是调用,您可以使用invocation.getArguments()
获取参数。
更新:@Benoit的回答似乎要优雅得多,因为ArgumentCaptor
不需要额外的逻辑来确定它是第一次调用还是第二次调用。