So speichern Sie die Ausgabe Log4j sendet STDOUT in einem JUnit-test?
Schreibe ich ein test und ich will die Nachrichten auf STDOUT durch die erprobte Methode. Hier ist mein code:
@Test
public void testAction() throws IllegalArgumentException, NoSuchMethodException, IllegalAccessException, InvocationTargetException,
CmdLineException, IOException {
PrintStream originalSTDOUT = System.out;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PrintStream ps = new PrintStream(baos);
try {
System.setOut(ps);
//Call to the method that will print text to STDOUT...
ps.flush();
String batchLog = baos.toString("UTF-8");
assertTrue("Invalid exception text !", batchLog.contains("my expected text..."));
} finally {
System.setOut(originalSTDOUT);//Restore original STDOUT
originalSTDOUT.write(baos.toByteArray());//Write back to STDOUT, even if I comment this line, outputs go to STDOUT...
ps.close();
}
}
Leider batchLog
ist immer leer, obwohl ich noch Lesen können der erwartete text nach STDOUT aus.
Die Methode, mit drucken von text auf STDOUT, in der Tat abfangen einer Ausnahme. Dann geht es zu einem Logger
wie unten:
melden.warnen("Ein Fehler ist aufgetreten:", e);
wo e
ist die Ausnahme, die ausgelöst wird, in dem die Methode rufe ich in meiner test.
Den Logger
verwendet diese appender für den Druck seiner Nachrichten: org.apache.log4j.ConsoleAppender
. Ist keine Besondere Konfiguration angewendet, um dieser appender.
Was bin ich ?
P. S.:
Diese SO beantworten ist interessant, aber es funktioniert nicht für mich, da die ConsoleAppender
ist bereits erstellt, bevor die StandardOutputStreamLog Regel handeln kann.
Java 6
Junit 4.10
- Wie funktioniert die Methode print text?
System.setOut
nur ändert sich der Wert desSystem.out
Feld; Sie können einen zwischengespeicherten Wert des Feldes oder einige andere Mittel, das schreiben auf stdout. - Der code funktioniert Prima als standalone-main-Methode. Überprüfen Sie Ihre JUnit setup-und teardown-Methoden. Problem irgendwo anders.
- Nicht reproduzieren können, diese mit einem normalen System.aus.println(...), wie u drucken von text auf stdout?
- Ich habe meinen Beitrag aktualisiert, die durch hinzufügen, wie die Methode druckt den text nach stdout aus.
- Da bist du mit Log4J können nicht ändern Sie einfach die logging-Konfiguration? Die
ConsoleAppender
- Klasse verwendet, was war der Wert derSystem.out
wenn der appender erstellt wurde; wenn der test ausgeführt wird, ist es zu spät um es zu ändern. Siehe die Quelle: docjar.com/html/api/org/apache/log4j/ConsoleAppender.java.html
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich endlich mein problem gelöst !
Mein Erster Versuch war falsch, weil ich die Umleitung des STDOUT zu spät, da @Joni erklärt in seinem Kommentar:
ConsoleAppender
ist bereits erstellt.Da, die exception-Nachricht verarbeitet, die von einem
Logger
ich beschlossen, fügen Sie einWriterAppender
gesichert durch eineStringWriter
um es in Ordnung zu bekommen die Nachricht.Hier ist meine funktionierende Lösung:
Etwas off-topic, aber bei einigen Leuten (wie mir, als ich zuerst diesen thread gefunden), könnte interessiert sein, bei der Erfassung von log-Ausgabe via SLF4J, commons-Tests's JUnit
@Rule
helfen könnte:Haftungsausschluss:
log4j
,log4j2
undlogback
sind verfügbar im moment, aber ich bin auch gerne mehr.Versuchen, die Aktivierung der autoflushing wahr PrintStream: