我应该使用Mockito doAnswer来测试Java中的删除方法吗



我想写一个单元测试来测试productRepository.delete方法:

public void delete(UUID uuid) {
final Product product = productRepository.findByUuid(uuid)
.orElseThrow(() -> new EntityNotFoundException(PRODUCT));
productRepository.delete(product);
}

然而,我真的不知道测试这种方法的正确方法是什么。有些方法使用verify,但我认为这不是一个好主意,因为它只是检查是否调用了productRepository的delete方法。相反,我在想一些事情,例如doAnswer(AdditionalAnswers.returnsFirstArg()).when(productRepository).delete(any());,但不确定这是否是测试productRepository.delete的最合适的方法。那么,我该如何正确地测试它呢?

您可以测试两件事:

  1. 验证是否使用正确的参数和
  2. 为不存在的UUID引发EntityNotFoundException

最好的方法是模仿productRepository delete((方法提及并在对的调用中引发预期的异常productRepository.findByUuid(uuid(when(productRepositoryMock.findByUuid(uuid)).thenThrow(new EntityNotFoundException(PRODUCT)));

Mockito文档更清晰:

有关自定义参数匹配器的信息,请查看ArgumentMatcher类的javadoc(用于存根或验证中使用的非平凡方法参数(。

使用复杂的参数匹配要合理。使用equals((和偶尔的anyX((匹配器的自然匹配风格倾向于给出干净的&简单的测试。有时,最好重构代码以允许equals((匹配,甚至实现equals(((方法来帮助进行测试。

最新更新