是否有可能以某种方式 "hold" Mockitos 的 return-value when...then construct in a temp-variable?

Is it possible to somehow "hold" the return-value of Mockitos when...then construct in a temp-variable?

我有一个 ServiceClass 和一个 RepositoryClass,我想从 Service 测试一个(真实的)方法,我想模​​拟 Repository。

我举个例子:

class PersonService {
  private final PersonRepository personRepository;

  public void manipulateData(Person p){
    p.setName("Martin");
    personRepository.save(p);
  }
}

现在我想验证 serviceClass 是否按预期操作了我的对象。为此,我想执行以下操作:

@Mock
PersonRepository personRepository; 

PersonService personService;

Person p = new Person("Josef");

when(personRepository.save(any())).***thenStoreThisValueInMyTempFieldAbove***
personService.manipulateData(p);
when(personRepository.find(any()).thenReturn(p);

assertThat(p.getName).equals("Martin");

是否可以像我的 when...then-construct 这样的东西? 当服务方法没有 return 值并且数据库是获取该对象并验证其正确性的唯一位置时,还有什么其他方法可以使用模拟存储库测试服务方法?

您可以使用 ArgumentCaptor。

您可以像下面这样定义捕获器:

@Captor
private ArgumentCaptor<Person> personCaptor;

然后您可以在调用您的 repo 方法时捕获该值。

when(personRepository.save(personCaptor.capture()));

最后你可以使用捕获的值来断言:

assertEquals("Martin", personCaptor.getValue().getName())

参考:https://www.baeldung.com/mockito-argumentcaptor