我需要测试一种方法,要求用户输入并向玩家收取输入的金额。要测试的方法:
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
}
答案 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