TDD实战(三)“井字游戏” 需求二
虫师 创建于 almost 7 years 之前
最后更新: less than a minute 之前
阅读数: 126
需求2
现在处理轮到哪个玩家落子问题。
需要提供一种途径,用于判断接下来该谁落子。
将需求分成三个测试:
- 玩家 X 先下;
- 如果上一次是 X 下的,接下来将轮到 O 下。
- 如果上一次是 O 下的,接下来将轮到 X 下。
测试用例1
import static org.junit.Assert.*;
……
@Test
public void givenFirstTurnWhenNextPlayerThenX(){
assertEquals('X', ticTacToe.nextPlayer());
}
在这条用例中用到了 JUnit 的断言方法 assertEquals()
,通过 nextPlayer()
判断下一个下棋的是否是 X 玩家。
实现代码1
对于当前的测试用例来说,根本不需要检查玩家 X 是否先下,因为就目前而言,只需要让 nextPlayer()
返回 X 就能让测试释通过。
在 TicTacToe 类中添加 nextPlayer()
方法。
public char nextPlayer() {
return 'X';
}
** 执行 测试用例1 检查它是否运行通过。
测试用例2
现在需要确保让玩家轮流下,玩家 X 下棋后,应轮到玩家 O, 然后再轮到玩家 X, 以此类推:
@Test
public void givenLastTurnWasXWhenNextPlayerThenO(){
ticTacToe.play(1,1);
assertEquals('O', ticTacToe.nextPlayer());
}
实现代码2
如果前一次是玩家 X 下的,接下来应该轮到玩家 O。
……
private char lastPlayer = '\0';
public void play(int x, int y){
checkAxis(x);
checkAxis(y);
setBox(x, y);
lastPlayer = nextPlayer();
}
public char nextPlayer() {
if(lastPlayer == 'X'){
return 'O';
}
return 'X';
}
……
** 执行 测试用例2 检查它是否运行通过。
测试用例3
如果前一次是玩家 O 下的,接下来应该是玩家 X 下。
@Test
public void givenLastTurnWasXWhenNextPlayerThenX(){
ticTacToe.play(1,1);
ticTacToe.play(1,2);
assertEquals('X', ticTacToe.nextPlayer());
}
即使什么也不做这一条用例,这个测试也可以通过。 因此它毫无用处,应用删除。