2015-05-26 15 views
-1

Мне нужно протестировать метод, который запрашивает у пользователя ввод и заряжает игрока введенной суммой. Метод тестирования:JUnit testing: имитирующий пользовательский ввод

public void askForBetSize() { 
    System.out.println("\nYour stack: " + player.getBalance()); 
    System.out.print("Place your bet: "); 
    bet = Integer.parseInt(keyboard.nextLine()); // = this needs to be simulated 
    player.charge(bet); 
} 

тест Текущий блок:

@Test 
public void bettingChargesPlayerRight() { 
    round.setCards(); 
    round.askForBetSize(); // here I would like to simulate a bet size of 100 
    assertEquals(900, round.getPlayer().getBalance()); // default balance is 1000 
} 

Я пытался реализовать this и this, но после тестирования предыдущих классов тест был остановлен, когда он начал тестировать этот метод.

ответ

0

См. Mockito (заглушки и макет), это поможет вам. Mockito

+0

конечно, вы можете написать реализацию поведения пользователей –

+0

Это будет лучший ответ, если он сказал * как * использовать Mockito для решения проблемы Ор в. – NamshubWriter

1

Что вам нужно, это двойной тест, в частности, Mock или Stub. Поскольку вы не хотите использовать Mockito, вы, вероятно, должны использовать свою собственную реализацию Stub. Stub - это объект, который всегда возвращает тот же законченный ответ.

Мое решение (и, как это уже упоминалось в другом месте) было бы реорганизовать ваш код, чтобы вы могли пройти тест дважды в тестируемый класс.

В моем примере я создал интерфейс для представления ответа пользователя и который объявляет ваш метод nextLine(). Реальный объект будет использовать System.in для захвата ответа пользователя.

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

public interface PlayerInput { 

    String nextLine(); 

} 


public class SimulateSystemInTest { 

    private Round round; 

    private PlayerInput keyboardStub = new PlayerInput() { 

             private String bet = "100"; 

             @Override 
             public String nextLine() { 
              System.out.println(bet); 
              return bet; 
             } 
            }; 

    @Before 
    public void setUp() { 
     round = new Round(new Player(), keyboardStub); 
    } 

    @Test 
    public void bettingChargesPlayerRight() { 
     round.setCards(); 
     round.askForBetSize(); // here I would like to simulate a bet size of 100 
     assertEquals(900, round.getPlayer().getBalance()); // default balance is 1000 
    } 

}