Voici la solution à la place de ByteArrayOutputStream. Cela n'ajoute rien à l'idée de System.setOut. Au contraire, je veux partager l'implémentation qui est meilleure que de tout capturer dans ByteArrayOutputStream. Je préfère ne capturer que les informations sélectionnées et laisser tous les messages de journal apparaître dans la console au fur et à mesure qu'ils sont enregistrés plutôt que de tout capturer dans une balckbox (de quelle taille?) Pour un traitement ultérieur.
/**
* Once started, std output is redirected to this thread.
* Thread redirects all data to the former system.out and
* captures some strings.*/
static abstract class OutputCaputre extends Thread {
// overrdie these methods for System.err
PrintStream getDownstream() { return System.out;}
void restoreDownstream() { System.setOut(downstream);}
// will be called for every line in the log
protected abstract void userFilter(String line);
final PrintStream downstream;
public final PipedInputStream pis;
private final PipedOutputStream pos;
OutputCaputre() throws IOException {
downstream = getDownstream();
pos = new PipedOutputStream();
pis = new PipedInputStream(pos);
System.setOut(new PrintStream(pos));
start();
}
public void run() {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(pis));
// once output is resotred, we must terminate
while (true) {
String line = br.readLine();
if (line == null) {
return;
}
downstream.println(line);
userFilter(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
public void terminate() throws InterruptedException, IOException {
restoreDownstream(); // switch back to std
pos.close(); // there will be no more data - signal that
join(); // and wait until capture completes
}
};
Voici un exemple d'utilisation de la classe:
OutputCaputre outputCapture = new OutputCaputre() {
protected void userFilter(String line) {
downstream.println("Capture: " + line);
}
};
System.out.println("do you see me captured?");
// here is your test
outputCapture.terminate(); // finally, stop capturing
@dfa, je ne suis pas d'accord. C'est similaire en effet mais assez différent. –
... accordé la réponse est la même ... –
L'autre thread a maintenant une meilleure réponse. Cela implique l'utilisation de la règle de système jUnit StandardOutputStreamLog. Il existe également des règles système pour stderr et stdin. –