为服务创建测试

Create test for service

此服务创建新玩家并将他们添加到列表中。

@Service
public class PlayerService {

@Autowired
private List<Player> playersList;
@Autowired
private Game game;


public void createPlayers(int players) {
    for(int i = 1; i < players; i++) {
        Player player = new Player();
        player.setPlayerName(i);
        playersList.add(player);
    }
    game.setPlayersList(playersList);
}
}

并且我尝试为此服务编写测试。但它不起作用。有什么想法吗?

@InjectMocks
private PlayerService playerService;
@Mock
private Game game;

@Test
public void addPlayer() {
    playerService.createPlayers(1);
    assertEquals(1, game.getPlayersList().size());
}

正如许多人所建议的那样,您应该更喜欢构造函数注入而不是字段注入。例如,参见 post on reflectoring.io

生成的代码更容易测试:

@Service
public class PlayerService {

    private List<Player> playersList;
    private Game game;

    public PlayerService(List<Player> playersList, Game game) {
        this.playersList = playersList;
        this.game = game;
    }

    public void createPlayers(int players) {
        for(int i = 1; i < players; i++) {
            Player player = new Player();
            player.setPlayerName(i);
            playersList.add(player);
        }
        game.setPlayersList(playersList);
    }
}

你的测试代码:

@Test
public void addPlayer() {
    var playerList = new ArrayList<Player>();
    var game = new Game(...);
    var playerService = new PlayerService(playerList, game);
    playerService.createPlayers(1);

    assertEquals(1, game.getPlayersList().size());
}

如您所见,您可以使用简单的 UnitTest 测试您的 PlayerService。不需要任何模拟框架。


顺便说一句。如果您能告诉我们什么不起作用,那就太好了。什么是意外行为?什么是例外。这将使给出正确答案变得容易得多:)

But it doesn't work. Any ideas whats wrong?