Il problema con BufferedReader.readLine()
è che si tratta di un metodo di blocco che attende l'input dell'utente.Mi sembra che tu non voglia particolarmente simularlo (cioè vuoi che i test siano veloci). Ma in un contesto di test ritorna continuamente null
ad alta velocità durante il test, che è fastidioso.
Per un purista si può fare la getInputLine
sotto package-privato, e prendere in giro è: facile-Peezy.
String getInputLine() throws Exception {
return br.readLine();
}
... dovresti assicurarti di avere un modo per fermare (in genere) un ciclo di interazione dell'utente con l'app. Faresti anche avere per far fronte al fatto che i vostri "linee di ingresso" sarebbe sempre lo stesso fino in qualche modo cambiato il doReturn
del vostro finto: difficilmente tipico di input dell'utente.
per un non-purista che vuole rendere la vita facile per loro stessi (e produrre le prove leggibili) si potrebbe mettere tutta questa roba qui sotto nel codice dell'app:
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;
}
... nel test si potrebbe quindi procedere come segue:
consoleHandler.setInputLines(Arrays.asList(new String[]{ "first input line", "second input line" }));
prima di attivare il metodo in questa classe "ConsoleHandler" che necessita di linee di input.
fonte
2017-01-22 18:55:18
Dal punto di vista TDD, questo evita il disegno che il test è "guida" o il tentativo di indicare. Tuttavia, l'OP non ha specificato TDD e, dal punto di vista del test, è una cosa molto ragionevole da fare: sfruttare il sistema globale. – Yishai
Non puoi semplicemente fare System.in = xxx come System.in è definitivo. È possibile utilizzare System.setIn, ma assicurarsi di tornare al valore predefinito nella rimozione. Inoltre, non è necessario eseguire il rollback del proprio InputStream, ByteArrayInputStream eseguirà il lavoro in modo corretto. –
Oohh yeap, mi sono confuso. Quello che ho cercato di dire è stato ... beh, modificherò la mia voce :) – OscarRyz