我想写一个单元测试来测试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
的最合适的方法。那么,我该如何正确地测试它呢?
您可以测试两件事:
- 验证是否使用正确的参数和
- 为不存在的UUID引发EntityNotFoundException
最好的方法是模仿productRepository delete((方法提及并在对的调用中引发预期的异常productRepository.findByUuid(uuid(when(productRepositoryMock.findByUuid(uuid)).thenThrow(new EntityNotFoundException(PRODUCT)));
Mockito文档更清晰:
有关自定义参数匹配器的信息,请查看ArgumentMatcher类的javadoc(用于存根或验证中使用的非平凡方法参数(。
使用复杂的参数匹配要合理。使用equals((和偶尔的anyX((匹配器的自然匹配风格倾向于给出干净的&简单的测试。有时,最好重构代码以允许equals((匹配,甚至实现equals(((方法来帮助进行测试。