Проблема с BufferedReader.readLine()
заключается в том, что это метод блокировки, который ожидает ввода данных пользователем. Мне кажется, что вы не особенно хотите имитировать это (т.е. вы хотите, чтобы тесты были быстрыми). Но в контексте тестирования он постоянно возвращает null
на высокой скорости во время тестирования, что утомительно.
Для пуриста вы можете сделать пакет getInputLine
ниже приватным и посмеяться над ним: easy-peezy.
String getInputLine() throws Exception {
return br.readLine();
}
... вам нужно убедиться, что у вас есть способ остановить (обычно) цикл взаимодействия пользователя с приложением. Вам также придется справиться с тем фактом, что ваши «строки ввода» всегда будут одинаковыми, пока вы каким-то образом не измените doReturn
вашего макета: вряд ли это типично для пользовательского ввода.
Для не пуристов, которые хотят облегчить себе жизнь (и создать удобочитаемые тесты), вы можете поместить все эти вещи ниже в код своего приложения:
private Deque<String> inputLinesDeque;
void setInputLines(List<String> inputLines) {
inputLinesDeque = new ArrayDeque<String>(inputLines);
}
private String getInputLine() throws Exception {
if (inputLinesDeque == null) {
// ... i.e. normal case, during app run: this is then a blocking method
return br.readLine();
}
String nextLine = null;
try {
nextLine = inputLinesDeque.pop();
} catch (NoSuchElementException e) {
// when the Deque runs dry the line returned is a "poison pill",
// signalling to the caller method that the input is finished
return "q";
}
return nextLine;
}
... в вашем тесте вы можете пойти так:
consoleHandler.setInputLines( Arrays.asList( new String[]{ "first input line", "second input line" }));
перед запуском метода в этом классе "ConsoleHandler", которому требуются строки ввода.