最近我开始与TDD一起学习Java。
我开始使用maven和junit来开发RockPaperScissorss游戏。...到目前为止,一切都很好。
那只是一个回合,赢了一个赢家。...所以“基本上”,我有两个主要的类:RoundTest和Round这样,如下所示:
*类RoundTest
public class RoundTest {
Player player1;
Player player2;
Round round;
Player winner;
@Before
public void setUp() throws Exception {
player1 = new Player();
player2 = new Player();
round = new Round();
}
@Test
public void player1AndPlayer2ChooseRock_roundIsDraw() {
//Given
//When
player1.choose(new Rock());
player2.choose(new Rock());
winner = round.play(player1,player2);
//Then
Assert.assertEquals(null, winner);
}
@Test
public void player1ChooseRockPlayer2ChoosePaper_Player2Wins() {
//Given
//When
player1.choose(new Rock());
player2.choose(new Paper());
winner = round.play(player1,player2);
//Then
Assert.assertEquals(player2, winner);
}
@Test
public void player1ChooseRockPlayer2ChooseScissors_Player1Wins() {
//Given
//When
player1.choose(new Rock());
player2.choose(new Scissors());
winner = round.play(player1,player2);
//Then
Assert.assertEquals(player1, winner);
}
@Test
public void player1ChoosePaperPlayer2ChoosePaper_roundIsDraw() {
//Given
//When
player1.choose(new Paper());
player2.choose(new Paper());
//Then
Assert.assertEquals(null, winner);
}
@Test
public void player1ChoosePaperPlayer2ChooseScissors_Player2Wins() {
//Given
//When
player1.choose(new Paper());
player2.choose(new Scissors());
winner = round.play(player1,player2);
//Then
Assert.assertEquals(player2, winner);
}
@Test
public void player1ChoosePaperPlayer2ChooseRock_Player1Wins() {
//Given
//When
player1.choose(new Paper());
player2.choose(new Rock());
winner = round.play(player1,player2);
//Then
Assert.assertEquals(player1, winner);
}
@Test
public void player1ChooseScissorsPlayer2ChooseScissors_roundIsDraw() {
//Given
//When
player1.choose(new Scissors());
player2.choose(new Scissors());
winner = round.play(player1,player2);
//Then
Assert.assertEquals(null, winner);
}
@Test
public void player1ChooseScissorsPlayer2ChoosePaper_Player1Wins() {
//Given
//When
player1.choose(new Scissors());
player2.choose(new Paper());
winner = round.play(player1,player2);
//Then
Assert.assertEquals(player1, winner);
}
@Test
public void player1ChooseScissorsPlayer2ChooseRock_Player2Wins() {
//Given
//When
player1.choose(new Scissors());
player2.choose(new Rock());
winner = round.play(player1,player2);
//Then
Assert.assertEquals(player2, winner);
}
*课堂回合
public class Round {
public Player play(Player player1, Player player2) {
Choice player1Choice = player1.getChoice();
Choice player2Choice = player2.getChoice();
if (player1Choice.beats(player2Choice)) {
return player1;
}
if (player2Choice.beats(player1Choice)) {
return player2;
}
return null;
}
现在,我想在不中断测试链的情况下,使用TDD添加“ 3之最佳”功能。
所以我创建了MatchTest和Match类。
Match类将管理游戏,其中玩家1和玩家2最多可以玩3次,但是从TDD的角度来看,我很难设计它。
第一个测试用例是P1在第一轮和第二轮比赛中获胜,赢得比赛。
*类MatchTest
public class MatchTest {
Match match;
Player player1;
Player player2;
Player winner;
@Before
public void setUp() throws Exception {
player1 = new Player();
player2 = new Player();
match = new Match();
}
@Test
public void test() {
//Given
//When
player1.choose(new Rock());
player2.choose(new Paper());
//Then
Assert.assertEquals(player1, match.getWinner(player1, player2));
}
*类匹配
public class Match {
public Object getWinner(Player player1, Player player2) {
return player1;
}
我真的很想要一些指导或想法...
非常感谢您。
最诚挚的问候,
Thiago
答案 0 :(得分:2)
注意:按照常规规则检查您的测试,“纸击败岩石”。
public Object getWinner(Player player1, Player player2) {
return player1;
}
这时,您可以选择两个不同的方向。
如果您没有对下一步的方向有所了解,请尝试进行三角剖分。这意味着添加一个新的测试,它将迫使您更改getWinner的实现。理想情况下,您选择只需要很小改动的新测试。例如,如果仅切换玩家1和玩家2的剧本,则应该让玩家2作为获胜者。
因此,您编写该测试,它将失败。然后对实现进行少量更改以使测试通过。然后看看是否可以清理代码。
如果要做对下一步的方向有所了解,那么在开始担心下一个测试之前,您可能会考虑删除实现中的重复项。在这种情况下,玩家获胜的事实与玩家所做的选择隐含关联。因此,请在您的代码中明确表达这一事实。
所以您最终可能会看到类似以下的内容:
private Round roundOne = new Round();
public Object getWinner(Player player1, Player player2) {
return roundOne.play(player1, player2);
}
该实现将一直有效,直到您开始将更改选择的玩家从一个回合传递给另一个回合。因此,您将需要弄清楚它的外观,并编写一些实现该行为的测试。然后,您返回比赛,并找出当玩家开始改变策略时测试的样子。
JBrains提供了The World's Best Intro to TDD可能会有所帮助。价格适中。
自2018年8月20日起更新。以下系列1和系列2的讲座可作为免费预览使用,即使这些按钮现在可能未显示“ Preview”。
他正在用Java实现他的测试和解决方案,但这不是Java教程-您可能偶尔需要寻找其他资源来阐明他在代码中的工作。