Unit testen van System.out.println () met JUnit

1. Overzicht

Bij het testen van eenheden kunnen we af en toe de berichten testen die we naar de standaarduitvoer schrijven via System.out.println ().

Hoewel we over het algemeen de voorkeur geven aan een logging-framework boven directe interactie met standaarduitvoer, is dit soms niet mogelijk.

In deze korte tutorial, we zullen een aantal manieren bekijken waarop we unit-tests kunnen uitvoeren System.out.println () met behulp van JUnit.

2. Een eenvoudige afdrukmethode

In deze tutorial zal de focus van onze tests liggen op een eenvoudige methode die naar de standaard outputstroom schrijft:

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

Een snelle herinnering dat de uit variabele is een openbare statische laatste PrintStream object dat de standaard uitvoerstroom vertegenwoordigt die bedoeld is voor systeembreed gebruik.

3. Werken met Core Java

Laten we nu eens kijken hoe we een unit-test kunnen schrijven om de inhoud te controleren van wat we naar het println methode. Voordat we onze eigenlijke unit-test schrijven, moeten we echter enige initialisatie in onze test uitvoeren:

private finale PrintStream standardOut = System.out; privé laatste ByteArrayOutputStream outputStreamCaptor = nieuwe ByteArrayOutputStream (); @BeforeEach public void setUp () {System.setOut (nieuwe PrintStream (outputStreamCaptor)); }

In de opstelling methode, wijzen we de standaard uitvoerstroom opnieuw toe aan een nieuwe PrintStream met een ByteArrayOutputStream. Zoals we zullen zien, is deze outputstroom waar de waarden nu worden afgedrukt:

@Test ongeldig gegevenSystemOutRedirection_whenInvokePrintln_thenOutputCaptorSuccess () {print ("Hallo Baeldung-lezers !!"); Assert.assertEquals ("Hallo Baeldung-lezers !!", outputStreamCaptor.toString () .trim ()); }

Nadat we het afdrukken methode met de gekozen tekst, kunnen we vervolgens verifiëren dat de outputStreamCaptor bevat de inhoud die we verwachtten. We noemen de bijsnijden methode om de nieuwe regel that System.out.println () voegt toe.

Aangezien de standaard uitvoerstroom een ​​gedeelde statische bron is die door andere delen van het systeem wordt gebruikt, we moeten ervoor zorgen dat het in zijn oorspronkelijke staat wordt hersteld wanneer onze test eindigt:

@AfterEach openbare leegte tearDown () {System.setOut (standardOut); }

Dit zorgt ervoor dat we later in andere tests geen ongewenste bijwerkingen krijgen.

4. Systeemregels gebruiken

In deze sectie we zullen kijken naar een nette externe bibliotheek genaamd System Rules die een set JUnit-regels biedt voor het testen van code die de Systeem klasse.

Laten we beginnen met het toevoegen van de afhankelijkheid aan onze pom.xml:

 com.github.stefanbirkner systeemregels 1.19.0 test 

Nu kunnen we doorgaan en een test schrijven met de SystemOutRule de bibliotheek biedt:

@Rule publieke finale SystemOutRule systemOutRule = nieuwe SystemOutRule (). EnableLog (); @Test openbare leegte gegevenSystemOutRule_whenInvokePrintln_thenLogSuccess () {print ("Hallo Baeldung-lezers !!"); Assert.assertEquals ("Hallo Baeldung-lezers !!", systemOutRule.getLog () .trim ()); }

Best wel gaaf! De ... gebruiken SystemOutRule, we kunnen de schrijfopdrachten onderscheppen System.out. Eerst beginnen we met het loggen van alles waarnaar wordt geschreven System.out door het enableLog methode op onze regel. Dan bellen we gewoon getLog om de tekst te laten schrijven System.out sinds we belden enableLog.

Deze regel bevat ook een handige methode die een logboek retourneert dat altijd het lijnscheidingsteken heeft als \ n

Assert.assertEquals ("Hallo Baeldung-lezers !! \ n", systemOutRule.getLogWithNormalizedLineSeparator ());

5. Systeemregels gebruiken met JUnit5 en Lambdas

In JUnit5 is het regelmodel vervangen door extensies. Gelukkig heeft de bibliotheek met systeemregels die in de laatste sectie wordt gepresenteerd een variatie die is voorbereid om met JUnit5 te werken.

System Lambda is verkrijgbaar bij Maven Central. Dus we kunnen doorgaan en het toevoegen aan ons pom.xml:

 com.github.stefanbirkner systeem-lambda 1.0.0 test 

Laten we nu onze test implementeren met deze versie van de bibliotheek:

@Test ongeldig gegevenTapSystemOut_whenInvokePrintln_thenOutputIsReturnedSuccessfully () gooit uitzondering {String text = tapSystemOut (() -> {print ("Hallo Baeldung-lezers !!");}); Assert.assertEquals ("Hallo Baeldung-lezers !!", text.trim ()); }

In deze versie we maken gebruik van de tik op SystemOut methode, die de instructie uitvoert en ons in staat stelt de inhoud vast te leggen die wordt doorgegeven System.out.

6. Conclusie

In deze zelfstudie hebben we een aantal benaderingen voor testen geleerd System.out.println. In de eerste benadering hebben we gezien hoe we kunnen omleiden naar waar we de standaard uitvoerstroom schrijven met behulp van core Java.

Toen zagen we hoe we een veelbelovende externe bibliotheek met de naam Systeemregels konden gebruiken door eerst JUnit 4-stijlregels te gebruiken en later met lambda's te werken.

Zoals altijd is de volledige broncode van het artikel beschikbaar op GitHub.