使用TDD

时间:2018-09-30 04:53:59

标签: java tdd

最近我开始与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

1 个答案:

答案 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教程-您可能偶尔需要寻找其他资源来阐明他在代码中的工作。