Problem z BufferedReader.readLine()
polega na tym, że jest to metoda blokująca, która czeka na wprowadzenie danych przez użytkownika.Wydaje mi się, że nie chcesz tego specjalnie symulować (tzn. Chcesz, aby testy były szybkie). Ale w kontekście testowym nieustannie zwraca on dużą prędkość podczas testu, co jest irytujące.
Dla purystów można ustawić getInputLine
poniżej jako prywatny pakiet i wyśmiać go: easy-peezy.
String getInputLine() throws Exception {
return br.readLine();
}
... musisz się upewnić, że masz sposób zatrzymania (zwykle) pętli interakcji użytkownika z aplikacją. Musiałbyś także poradzić sobie z faktem, że twoje "linie wejściowe" będą zawsze takie same, dopóki nie zmienisz w jakiś sposób fałszywego: nietypowego dla użytkownika.
przypadku nieprzestrzegania purist, który chce ułatwić życie dla siebie (i produkują testy czytelny) można umieścić wszystkie te rzeczy poniżej w kodzie aplikacji:
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;
}
... w teście to polubisz następnie wykonaj to:
consoleHandler.setInputLines(Arrays.asList(new String[]{ "first input line", "second input line" }));
przed wyzwoleniem metody w tej klasie "ConsoleHandler", która wymaga linii wejściowych.
Z perspektywy TDD, to unika się projektowania, że test jest "jazda" lub próbie wskazania. Jednak PO nie określał TDD, a z perspektywy testowej jest to bardzo rozsądne - wykorzystać system globalny. – Yishai
Nie można po prostu zrobić System.in = xxx, ponieważ System.in jest ostateczny. Możesz użyć System.setIn, ale upewnij się, że powrócisz do domyślnego przy zerwaniu. Ponadto nie trzeba uruchamiać własnego InputStream, ByteArrayInputStream będzie ładnie działać. –
Oohh yeap, byłem zdezorientowany. Próbowałem powiedzieć, że ... cóż, zmienię mój wpis :) – OscarRyz