何时编写单元测试

问题描述 投票:0回答:1

我是单元测试的新手,我不确定什么场景需要测试。我有以下方法:

public CreatePlayerResponse create(CreatePlayerRequest request) {
        Optional<Player> optionalPlayer = playerRepository.findPlayerByUsername(request.getUsername());
        
        if (optionalPlayer.isPresent()) {
                throw new PlayerAlreadyExistsException("Player with username already exists.");
        }

        ...
    }

我不确定是否应该为异常抛出场景编写测试。在测试中,我将模拟存储库,以便测试仅检查 isPresent 是否正常工作。我觉得这太基础了,可能不需要测试,但我不确定。针对什么场景我们应该编写单元测试?

java unit-testing testing junit mocking
1个回答
0
投票

考虑到您的被测系统 (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(...)});
© www.soinside.com 2019 - 2024. All rights reserved.