446 Stimmen

JUnit-Test für System.out.println()

Ich muss JUnit-Tests für eine alte Anwendung schreiben, die schlecht entworfen ist und eine Menge Fehlermeldungen in die Standardausgabe schreibt. Wenn die getResponse(String request) Methode verhält sich korrekt und liefert eine XML-Antwort:

@BeforeClass
public static void setUpClass() throws Exception {
    Properties queries = loadPropertiesFile("requests.properties");
    Properties responses = loadPropertiesFile("responses.properties");
    instance = new ResponseGenerator(queries, responses);
}

@Test
public void testGetResponse() {
    String request = "<some>request</some>";
    String expResult = "<some>response</some>";
    String result = instance.getResponse(request);
    assertEquals(expResult, result);
}

Wenn er jedoch fehlerhaftes XML erhält oder die Anfrage nicht versteht, gibt er zurück null und schreibt einige Dinge in die Standardausgabe.

Gibt es eine Möglichkeit, die Konsolenausgabe in JUnit zu bestätigen? Um Fälle wie zu fangen:

System.out.println("match found: " + strExpr);
System.out.println("xml not well formed: " + e.getMessage());

1voto

sumeet Punkte 1

Wenn die Funktion nach System.out druckt, können Sie diese Ausgabe erfassen, indem Sie die Methode System.setOut verwenden, um System.out in einen von Ihnen bereitgestellten PrintStream zu ändern. Wenn Sie einen PrintStream erstellen, der mit einem ByteArrayOutputStream verbunden ist, können Sie die Ausgabe als String erfassen.

// Create a stream to hold the output
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PrintStream ps = new PrintStream(baos);
// IMPORTANT: Save the old System.out!
PrintStream old = System.out;
// Tell Java to use your special stream
System.setOut(ps);
// Print some output: goes to your special stream
System.out.println("Foofoofoo!");
// Put things back
System.out.flush();
System.setOut(old);
// Show what happened
System.out.println("Here: " + baos.toString());

0voto

Sam Jacobs Punkte 338

Sie sollten den system.out-Stream nicht umleiten, da dieser für die GESAMTE JVM umgeleitet wird. Alles andere, was auf der JVM läuft, kann durcheinander gebracht werden. Es gibt bessere Möglichkeiten, die Eingabe/Ausgabe zu testen. Schauen Sie sich Stubs/Mocks an.

0voto

Hakan54 Punkte 2111

Obwohl diese Frage schon sehr alt ist und es bereits sehr gute Antworten gibt, möchte ich eine Alternative anbieten. Mir gefiel die Antwort von dfa Ich wollte jedoch etwas haben, das in verschiedenen Projekten wiederverwendbar ist, ohne die Konfiguration zu kopieren, und so habe ich eine Bibliothek daraus gemacht und wollte der Gemeinschaft etwas zurückgeben. Sie heißt Konsolen-Captor und Sie können es mit dem folgenden Schnipsel hinzufügen:

<dependency>
    <groupId>io.github.hakky54</groupId>
    <artifactId>consolecaptor</artifactId>
    <version>1.0.0</version>
    <scope>test</scope>
</dependency>

Beispiel Klasse

public class FooService {

    public void sayHello() {
        System.out.println("Keyboard not responding. Press any key to continue...");
        System.err.println("Congratulations, you are pregnant!");
    }

}

Einheitstest

import static org.assertj.core.api.Assertions.assertThat;

import nl.altindag.console.ConsoleCaptor;
import org.junit.jupiter.api.Test;

public class FooServiceTest {

    @Test
    public void captureStandardAndErrorOutput() {
        ConsoleCaptor consoleCaptor = new ConsoleCaptor();

        FooService fooService = new FooService();
        fooService.sayHello();

        assertThat(consoleCaptor.getStandardOutput()).contains("Keyboard not responding. Press any key to continue...");
        assertThat(consoleCaptor.getErrorOutput()).contains("Congratulations, you are pregnant!");

        consoleCaptor.close();
    }
}

-1voto

Afee Punkte 2639

Sie können nicht direkt drucken, indem Sie system.out.println oder mit Logger-Api während der Benutzung JUnit . Wenn Sie jedoch beliebige Werte überprüfen möchten, können Sie einfach die Funktion

Assert.assertEquals("value", str);

Es wird der folgende Assertion-Fehler ausgelöst:

java.lang.AssertionError: expected [21.92] but found [value]

Ihr Wert sollte 21,92 sein. Wenn Sie nun mit diesem Wert wie unten beschrieben testen, wird Ihr Testfall bestehen.

 Assert.assertEquals(21.92, str);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X