Test unitaire de System.out.println () avec JUnit

1. Vue d'ensemble

Lors des tests unitaires, nous pouvons parfois vouloir tester les messages que nous écrivons sur la sortie standard via System.out.println () .

Bien que nous préférions généralement un cadre de journalisation à une interaction directe avec la sortie standard, cela n'est parfois pas possible.

Dans ce rapide tutoriel, nous allons jeter un oeil à quelques façons dont nous pouvons tester unitaire System.out.println () en utilisant JUnit.

2. Une méthode d'impression simple

Tout au long de ce tutoriel, nos tests se concentreront sur une méthode simple qui écrit dans le flux de sortie standard:

private void print(String output) { System.out.println(output); } 

Un rappel rapide que la variable out est un objet PrintStream final statique public qui représente le flux de sortie standard destiné à une utilisation à l'échelle du système.

3. Travailler avec Core Java

Voyons maintenant comment nous pouvons écrire un test unitaire pour vérifier le contenu de ce que nous envoyons à la méthode println . Cependant, avant d'écrire notre test unitaire réel, nous devrons fournir une initialisation dans notre test:

private final PrintStream standardOut = System.out; private final ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); @BeforeEach public void setUp() { System.setOut(new PrintStream(outputStreamCaptor)); }

Dans la méthode setUp , nous réaffectons le flux de sortie standard à un nouveau PrintStream avec un ByteArrayOutputStream . Comme nous allons le voir, ce flux de sortie est l'endroit où les valeurs seront maintenant imprimées:

@Test void givenSystemOutRedirection_whenInvokePrintln_thenOutputCaptorSuccess() { print("Hello Baeldung Readers!!"); Assert.assertEquals("Hello Baeldung Readers!!", outputStreamCaptor.toString() .trim()); }

Après avoir appelé la méthode d' impression avec le texte choisi, nous pouvons alors vérifier que le outputStreamCaptor contient le contenu que nous attendions. Nous appelons la méthode trim pour supprimer la nouvelle ligne ajoutée par System.out.println () .

Comme le flux de sortie standard est une ressource statique partagée utilisée par d'autres parties du système, nous devons prendre soin de le restaurer à son état d'origine lorsque notre test se termine:

@AfterEach public void tearDown() { System.setOut(standardOut); }

Cela garantit que nous n'obtiendrons aucun effet secondaire indésirable plus tard dans d'autres tests.

4. Utilisation des règles système

Dans cette section, nous allons jeter un coup d'œil à une bibliothèque externe soignée appelée System Rules qui fournit un ensemble de règles JUnit pour tester le code qui utilise la classe System .

Commençons par ajouter la dépendance à notre pom.xml :

 com.github.stefanbirkner system-rules 1.19.0 test 

Maintenant, nous pouvons continuer et écrire un test en utilisant le SystemOutRule fourni par la bibliothèque:

@Rule public final SystemOutRule systemOutRule = new SystemOutRule().enableLog(); @Test public void givenSystemOutRule_whenInvokePrintln_thenLogSuccess() { print("Hello Baeldung Readers!!"); Assert.assertEquals("Hello Baeldung Readers!!", systemOutRule.getLog() .trim()); }

Plutôt cool! En utilisant SystemOutRule, nous pouvons intercepter les écritures dans System.out . Tout d'abord, nous commençons à consigner tout ce qui est écrit dans System.out en appelant la méthode enableLog sur notre règle. Ensuite, nous appelons simplement getLog pour obtenir le texte écrit dans System.out puisque nous avons appelé enableLog .

Cette règle inclut également une méthode pratique qui renvoie un journal qui a toujours le séparateur de ligne comme \ n

Assert.assertEquals("Hello Baeldung Readers!!\n", systemOutRule.getLogWithNormalizedLineSeparator());

5. Utilisation des règles système avec JUnit5 et Lambdas

Dans JUnit5, le modèle de règles a été remplacé par des extensions. Heureusement, la bibliothèque de règles système présentée dans la dernière section a une variante prête à fonctionner avec JUnit5.

System Lambda est disponible auprès de Maven Central. Nous pouvons donc continuer et l'ajouter à notre pom.xml :

 com.github.stefanbirkner system-lambda 1.0.0 test 

Maintenant, implémentons notre test en utilisant cette version de la bibliothèque:

@Test void givenTapSystemOut_whenInvokePrintln_thenOutputIsReturnedSuccessfully() throws Exception { String text = tapSystemOut(() -> { print("Hello Baeldung Readers!!"); }); Assert.assertEquals("Hello Baeldung Readers!!", text.trim()); }

Dans cette version, nous utilisons la méthode tapSystemOut , qui exécute l'instruction et nous permet de capturer le contenu passé à System.out .

6. Conclusion

Dans ce didacticiel, nous avons découvert quelques approches pour tester System.out.println . Dans la première approche, nous avons vu comment rediriger où nous écrivons le flux de sortie standard en utilisant le noyau Java.

Ensuite, nous avons vu comment utiliser une bibliothèque externe prometteuse appelée Règles système en utilisant d'abord les règles de style JUnit 4, puis en travaillant plus tard avec les lambdas.

Comme toujours, le code source complet de l'article est disponible à l'adresse over sur GitHub.