Mockito嵌套方法被多次调用



我有一个带有方法的服务类,它多次调用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来处理模拟myRepositorysave调用。如果需要执行myRepository对象的实际方法,可以向链中添加一个doCallRealMethod()

传递给Answer的参数就是调用,您可以使用invocation.getArguments()获取参数。

更新:@Benoit的回答似乎要优雅得多,因为ArgumentCaptor不需要额外的逻辑来确定它是第一次调用还是第二次调用。