Это не то же самое, что и этот вопрос: JUnit: How to simulate System.in testing?, что касается насмешливого stdin.Как я могу проверить, что приложение CLI ждет ввода
Я хочу знать, как проверить (как в TDD), что простой метод Java с методом main
ждет ввода.
Мой тест:
@Test
public void appRunShouldWaitForInput(){
long startMillis = System.currentTimeMillis();
// NB obviously you'd want to run this next line in a separate thread with some sort of timeout mechanism...
// that's an implementation detail I've omitted for the sake of avoiding clutter!
App.main(null);
long endMillis = System.currentTimeMillis();
assertThat(endMillis - startMillis).isGreaterThan(1000L);
}
Мой SUT main
:
public static void main(String args[]) {
BufferedReader br = null;
try {
br = new BufferedReader(new InputStreamReader(System.in));
System.out.print("Enter something : ");
String input = br.readLine();
} catch (IOException e) {
e.printStackTrace();
}
... тест не пройден. Код не ждет. Но когда вы запускаете приложение в командной строке, он действительно ждет.
NB кстати я также попробовать с установкой stdin
в sthg еще:
System.setIn(new ByteArrayInputStream(dummy.getBytes()));
scanner = new Scanner(System.in);
... это не выдержал испытание.
Если * сделали * ожидание ввода, ваше испытание будет ждать вечно. Кроме того, вы действительно думаете, что это хороший тест? Он не тестирует * ваш * код, это тестирование 'BufferedReader'. – Kayaman
Если вы действительно хотите протестировать 'BufferedReader', то сообщение, которое вы связали, - это то, что вам нужно. Просто помните, что идея TDD или любого тестирования заключается не в том, чтобы проверить код, который был разработан (и, надеюсь, проверен) другими. Тестирование того, блокирует ли 'readLine()' до тех пор, пока не получит '\ n', совершенно откровенно смешно. – Kayaman
(слегка измененный, чтобы показать, что я пытаюсь сделать). Я не думаю, что речь идет о тестировании «BufferedReader». Метод 'main' без строки' br.readLine() 'немедленно возвращается: поэтому мне нужен тест, чтобы оправдать включение этой строки. Если эта строка кода приложения была впоследствии удалена или не выполнена по какой-то причине, я бы хотел, чтобы этот тест завершился неудачей. Простой факт заключается в том, что 'br.readLine()' определенно НЕ блокируется, когда класс приложения запускается из моего тестового метода. Почему нет? –