我是单元测试的新手,我不确定什么场景需要测试。我有以下方法:
public CreatePlayerResponse create(CreatePlayerRequest request) {
Optional<Player> optionalPlayer = playerRepository.findPlayerByUsername(request.getUsername());
if (optionalPlayer.isPresent()) {
throw new PlayerAlreadyExistsException("Player with username already exists.");
}
...
}
我不确定是否应该为异常抛出场景编写测试。在测试中,我将模拟存储库,以便测试仅检查 isPresent 是否正常工作。我觉得这太基础了,可能不需要测试,但我不确定。针对什么场景我们应该编写单元测试?
考虑到您的被测系统 (SUT) 是您在其中定义了 create 方法的类,您应该涵盖所有场景,包括“快乐路径”(以验证 optionPlayer 是否不存在)和例外场景。顺便说一句,你应该包括一个
throws PlayerAlreadyExistsException
在方法签名中,以便可以抛出异常,如下所示:
public CreatePlayerResponse create(CreatePlayerRequest request) throws PlayerAlreadyExistsException {
Optional<Player> optionalPlayer = playerRepository.findPlayerByUsername(request.getUsername());
if (optionalPlayer.isPresent()) {
throw new PlayerAlreadyExistsException("Player with username already exists.");
}
...
}
因此,您应该考虑在同一方法的不同测试用例中为每种情况包含一个断言。例如:
@Test void create_ShouldCreateANewPlayer_WhenItsNameIsNotAlreadyRegisteredInTheRepository() ...
还有另一个测试:
@Test void create_ShouldThrowAPlayerAlreadyExistsException_WhenItsNameHasBeenAlreadyRegisteredInTheRepository()
您可以使用:
assertThrows(PlayerAlreadyExistsException.class, () -> {create(...)});