Java Mockito-多次调用的嵌套方法
我有一个带有方法的服务类,它多次调用ie.Java Mockito-多次调用的嵌套方法,java,spring-boot,mockito,Java,Spring Boot,Mockito,我有一个带有方法的服务类,它多次调用ie.repository.save()。我正在测试所说的服务方法。是否可以捕获xtime上的save()方法调用并获取其传递/返回的参数 例如: class MyService{ void doSomething(){ myRepository.save(obj1); // some code; myRepository.save(obj2); } } 我正在测试doSomething方法
repository.save()
。我正在测试所说的服务方法。是否可以捕获x
time上的save()
方法调用并获取其传递/返回的参数
例如:
class MyService{
void doSomething(){
myRepository.save(obj1);
// some code;
myRepository.save(obj2);
}
}
我正在测试
doSomething
方法,希望得到第一个save方法的结果和/或传递的参数。我正在使用mockito。我假设您将myRepository
作为对MyService
的依赖项传递。在这种情况下,您可以在测试中创建它的模拟,并通过该模拟
您可以调用Mockito.doAnswer(…).when(myRepository).save(any())
并传递一个Answer
,该Answer处理被模拟的myRepository
调用。如果需要执行myRepository
对象的实际方法,可以向链中添加doCallRealMethod()
传递给答案的参数是调用,您可以使用invocation.getArguments()
获取参数
更新:@Benoit的回答似乎要优雅得多,因为参数捕获器
不需要额外的逻辑来确定它是第一次调用还是第二次调用。与前面的回答类似,我假设myRepository
属于myRepository
类型,被模拟并传递给myService
。您可以使用以下命令捕获并检查传递给方法save()
的参数:
@测试
公共void testDoSomething(){
//给定
MyRepository MyRepository=Mockito.mock(MyRepository.class);
MyService MyService=newmyservice(myRepository);
//什么时候
myService.doSomething();
//然后
ArgumentCaptor captor=ArgumentCaptor.forClass(Object.class);
验证(myRepository,Mockito.times(2)).save(captor.capture());
Assert.assertEquals(obj1,captor.getAllValues().get(0));//第一次调用save()
Assert.assertEquals(obj2,captor.getAllValues().get(1));//第二次调用save()
}
我仍然不知道如何获得第一个方法调用?我在(myRepo.save())时处理了。返回(…)
,但我想检查传递给第一个repo.save
方法调用的对象。在第一次调用之后,我对其他相同的方法调用不感兴趣,也不想测试与我的doSomething
方法分离的特定方法。@Aline137您必须使用answer
方法内部的逻辑来决定它是第一次调用还是第二次调用。例如,您可以切换布尔值(第一次调用为true,第二次调用为false)-假设您只在MyService
中调用save
。