JUnit测试:模拟用户输入

时间:2015-05-26 10:04:05

标签: java unit-testing testing junit

我需要测试一种方法,要求用户输入并向玩家收取输入的金额。要测试的方法:

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
}

我尝试实现thisthis但在测试以前的类后,测试在开始测试此方法时停止运行。

2 个答案:

答案 0 :(得分:1)

你需要的是一个测试双,特别是模拟或存根。由于您不想使用Mockito,您可能应该使用自己的Stub实现。 Stub是一个始终返回相同的预设响应的对象。

我的解决方案(并且可能已在其他地方提到过)将重构您的代码,以便您可以将测试double传递给被测试的类。

在我的示例中,我创建了一个界面来表示用户的答案,并声明了你的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
    }

}

答案 1 :(得分:0)

见Mockito(存根和模拟),它会对你有用。Mockito