Java Mockito-多次调用的嵌套方法

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方法

我有一个带有方法的服务类,它多次调用ie.
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