RockPaperScissors Game (Best of 3) с использованием TDD - PullRequest
0 голосов
/ 30 сентября 2018

Недавно я начал изучать Java вместе с TDD.

Я начал разрабатывать игру RockPaperScissors, используя maven и junit .... и пока все хорошо.

Это был всего лишь одинраунд, возвращая победителя .... так что "в основном" у меня есть 2 основных класса: 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);
}   

* класс Round

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;
}

Теперь я хочу добавить функциональность «лучший из 3», используя TDD без разрыва цепочки тестов ...

Итак, я создал класс 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));        
}

* класс Match

public class Match {

public Object getWinner(Player player1, Player player2) {

    return player1;
}

Мне бы очень хотелось несколько советов или идей ...

Заранее большое спасибо.

С уважением,

Thiназад

1 Ответ

0 голосов
/ 30 сентября 2018

Примечание: проверьте свой тест - по обычным правилам, Paper превосходит Rock.

public Object getWinner(Player player1, Player player2) {
    return player1;
}

На данный момент есть два разных направления, по которым вы можете идти.

Если вы не имейте представление о том, куда вы идете дальше, затем попытайтесь триангулировать.Это значит добавить новый тест, который заставит вас изменить реализацию getWinner.В идеале вы выбираете новый тест, который требует лишь небольшого изменения.Например, если вы просто переключаете игры, сделанные player1 и player2, то вы должны получить player2 в качестве победителя.

Итак, вы пишете этот тест, и он провалится.Затем внесите небольшое изменение в реализацию, чтобы пройти тест.Затем посмотрите, сможете ли вы очистить код.

Если вы делаете , у вас есть представление о том, куда вы собираетесь идти дальше, то перед тем, как начать беспокоиться о следующем тесте, вы можете подумать об удалениидублирование в вашей реализации.В этом случае тот факт, что игрок выигрывает, неявно связан с выбором, который сделал игрок.Поэтому сделайте этот факт явным в своем коде.

Таким образом, вы можете получить что-то похожее на это:

private Round roundOne = new Round();

public Object getWinner(Player player1, Player player2) {
    return roundOne.play(player1, player2);
}

И эта реализация будет работать доВы начинаете разыгрывать игроков, которые меняют свой выбор с одного раунда на следующий.Поэтому вам нужно выяснить, как это выглядит, и написать несколько тестов, которые реализуют это поведение.Затем вы возвращаетесь к матчу и выясняете, как выглядит тест, когда игроки начинают варьировать свои стратегии.

JBrains предлагает лучшее в мире вступление в TDD , которое может помочь.Цена стоит попробовать.

Обновление от 20 августа 2018 года. Лекции внизу для Серии 1 и Серии 2 доступны в качестве предварительного просмотра, даже если кнопки не говорят "Предварительный просмотр "прямо сейчас.

Он внедряет свои тесты и решения на Java, но это не учебник по Java - иногда вам может понадобиться поискать другие ресурсы, чтобы уточнить, что он делает вкод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...