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 des System.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 der System.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
InformationsquelleAutor Stephan | 2013-08-12
Schreibe einen Kommentar