【发布时间】:2018-12-10 02:07:18
【问题描述】:
我有以下课程:
public class Game {
@Getter
private String gameId;
private String player1Id;
private String player2Id;
private String currentPlayer;
private Board board;
public Game() {
board = new Board();
gameId = UUID.randomUUID().toString();
}
public void joinGame(String playerUUID) {
if (player1 == null) {
player1 = playerUUID;
currentPlayer = player1;
} else if (player2 == null) {
player2 = playerUUID;
} else {
throw new IllegalArgumentException("Cannot join");
}
}
.....
}
我想测试joinGame()方法中的逻辑:
@Test
void testJoinGame() {
String player1Id = UUID.randomUUID().toString();
String player2Id = UUID.randomUUID().toString();
game.joinGame(player1Id);
game.joinGame(player2Id);
// this won't compile of course as fields are private
assertEquals(player1Id, game.player1Id);
assertEquals(player2Id, game.player2Id);
assertEquals(player1Id, game.currentPlayer);
}
在我的 JUnit 测试中我不应该做两件坏事,因为我经常读到: 1. 更改字段的可见性以进行测试。 2. 使用反射来获取私有字段的值。 (我可以看到这两种方法在我从事的项目中被大量使用,但我们假设它们没有)。
另外,我有时读到如果我想测试我的私有字段,那么这意味着类的接口定义错误。
但我想说,在这个例子中,情况并非如此:两个用户 ID 都只在类内部使用,没有必要公开它们。 我仍然想确保顺序是正确的:第一个尝试加入游戏的用户将是玩家 1(+ 他/她将是当前用户,例如将迈出第一步),第二个 - 玩家 2。
我想问一下测试这种方法的正确解决方案是什么?
【问题讨论】: