junit тест с методом включающим Scanner (System.in)
Пожалуйста подскажите или намекните как можно протестировать такой метод? Пользователь должен вводить ответ в консоль, но в junit там же нельзя писать, оно должно брать откуда-то значение. Как мне его туда "отправить"? Стопорюсь на этом моменте
Отдельно методы isTrue и isFalse работают и тестируются.
public boolean run() {
for (int i = 0; i < REPEAT_COUNT + 1; i++) {
System.out.println(message);
String answer = SCANNER.nextLine();
if (isTrue(answer)) {
return true;
}
if (isFalse(answer)) {
return false;
}
System.out.println("Cant read your answer, try again");
}
throw new UncheckedIOException(
new IOException("Cant read your answer more then 3 times, program close"));
}
Ответы (2 шт):
Автор решения: Sergey Zh.
→ Ссылка
Нужно подменить поток ввода для Scanner, вместо System.in указать другой InputStream.
Это можно сделать через System.setIn(...)
@Test
void runTrueAnswerTest() throws IOException {
ByteArrayInputStream in = new ByteArrayInputStream("yes".getBytes());
InputStream inputStream = System.in; // сохраняем ссылку на ввод с клавиатуры
System.setIn(in); // подменяем ввод
CliSimpleAskView cliSimpleAskView = new CliSimpleAskView("yes or no?");
assertTrue(cliSimpleAskView.run());
System.setIn(inputStream); // подменяем обратно
}
@Test
void runFalseAnswerTest() throws IOException {
ByteArrayInputStream in = new ByteArrayInputStream("no".getBytes());
InputStream inputStream = System.in;
System.setIn(in);
CliSimpleAskView cliSimpleAskView = new CliSimpleAskView("yes or no?");
assertFalse(cliSimpleAskView.run());
System.setIn(inputStream);
}
Автор решения: Xa3uK
→ Ссылка
Сделал тестовые методы, по отдельности они работают, Scanner подменяется
@Test
void runTrueAnswerTest() throws IOException {
ByteArrayInputStream in = new ByteArrayInputStream("yes".getBytes());
System.setIn(in);
CliSimpleAskView cliSimpleAskView = new CliSimpleAskView("yes or no?");
assertTrue(cliSimpleAskView.run());
System.setIn(System.in);
System.in.close();
in.close();
}
@Test
void runFalseAnswerTest() throws IOException {
ByteArrayInputStream in = new ByteArrayInputStream("no".getBytes());
System.setIn(in);
CliSimpleAskView cliSimpleAskView = new CliSimpleAskView("yes or no?");
assertFalse(cliSimpleAskView.run());
System.setIn(System.in);
System.in.close();
in.close();
}
Но если запустить все вместе - второй тест не отрабатывает, выдает ошибку:
java.util.NoSuchElementException: No line found
at java.base/java.util.Scanner.nextLine(Scanner.java:1651)