Одним из распространенных способов протестировать аналогичный код было бы извлечь метод, который принимает Scanner и PrintWriter, аналогичный этот ответ StackOverflow и проверьте, что:
public void processUserInput() {
processUserInput(new Scanner(System.in), System.out);
}
/** For testing. Package-private if possible. */
public void processUserInput(Scanner scanner, PrintWriter output) {
output.println("Give a number between 1 and 10");
int input = scanner.nextInt();
while (input < 1 || input > 10) {
output.println("Wrong number, try again.");
input = scanner.nextInt();
}
return input;
}
Обратите внимание, что вы не сможете прочитать свой вывод до конца, и вам нужно будет указать весь свой ввод заранее:
@Test
public void shouldProcessUserInput() {
StringWriter output = new StringWriter();
String input = "11\n" // "Wrong number, try again."
+ "10\n";
assertEquals(10, systemUnderTest.processUserInput(
new Scanner(input), new PrintWriter(output)));
assertThat(output.toString(), contains("Wrong number, try again.")););
}
Конечно, вместо того, чтобы создавать метод перегрузки, вы также можете оставить «сканер» и «выход» в качестве изменяемых полей в тестируемой системе. Я предпочитаю, чтобы классы были как можно более безгражданскими, но это не очень большая уступка, если это важно для вас или ваших коллег/инструктора.
Вы также можете поместить свой тестовый код в тот же пакет Java, что и тестируемый код (даже если он находится в другой исходной папке), что позволит вам ослабить видимость перегрузки с двумя параметрами, чтобы она была закрытой для пакета.
person
Jeff Bowman
schedule
29.04.2014