Enhedstest af System.out.println () med JUnit

1. Oversigt

Under enhedstest kan vi lejlighedsvis ønske at teste de meddelelser, vi skriver til standardoutput via System.out.println ().

Selvom vi generelt foretrækker en logningsramme frem for direkte interaktion med standardoutput, er det undertiden ikke muligt.

I denne hurtige vejledning vi kigger på et par måder, vi kan enhedstest på System.out.println () ved hjælp af JUnit.

2. En enkel udskrivningsmetode

Gennem denne tutorial vil vores test fokusere på en enkel metode, der skriver til standardoutputstrømmen:

privat tomrumsudskrivning (String output) {System.out.println (output); } 

En hurtig påmindelse om, at ud variabel er en offentlig statisk endelig PrintStream objekt, der repræsenterer standardoutputstrømmen beregnet til brug i hele systemet.

3. Arbejde med Core Java

Lad os nu se, hvordan vi kan skrive en enhedstest for at kontrollere indholdet af det, vi sender til println metode. Inden vi skriver vores faktiske enhedstest, skal vi dog give nogle initialiseringer i vores test:

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

I Opsætning metode, tildeler vi standardoutputstrømmen til en ny PrintStream med en ByteArrayOutputStream. Som vi skal se, er denne outputstrøm, hvor værdierne nu udskrives:

@Test ugyldigt givenSystemOutRedirection_whenInvokePrintln_thenOutputCaptorSuccess () {print ("Hello Baeldung Readers !!"); Assert.assertEquals ("Hej Baeldung-læsere !!", outputStreamCaptor.toString () .trim ()); }

Efter vi kalder Print metode med den valgte tekst, kan vi derefter kontrollere, at outputStreamCaptor indeholder det indhold, vi havde forventet. Vi kalder trimme metode til at fjerne den nye linje, der System.out.println () tilføjer.

Da standardoutputtet er en delt statisk ressource, der bruges af andre dele af systemet, vi skal sørge for at gendanne den til sin oprindelige tilstand, når vores test afsluttes:

@AfterEach offentligt ugyldigt tearDown () {System.setOut (standardOut); }

Dette sikrer, at vi ikke får nogen uønskede bivirkninger senere i andre tests.

4. Brug af systemregler

I dette afsnit, Vi kigger på et pænt eksternt bibliotek kaldet Systemregler, der giver et sæt JUnit-regler til testkode, der bruger System klasse.

Lad os starte med at tilføje afhængigheden af ​​vores pom.xml:

 com.github.stefanbirkner system-regler 1.19.0 test 

Nu kan vi gå videre og skrive en test ved hjælp af SystemOutRule biblioteket giver:

@Rule offentlig endelig SystemOutRule systemOutRule = ny SystemOutRule (). EnableLog (); @Test offentlig ugyldighed givenSystemOutRule_whenInvokePrintln_thenLogSuccess () {print ("Hello Baeldung Readers !!"); Assert.assertEquals ("Hej Baeldung-læsere !!", systemOutRule.getLog () .trim ()); }

Temmelig sejt! Bruger SystemOutRule, vi kan opfange de skriver til System.out. Først begynder vi at logge alt skrevet til System.out ved at ringe til aktivérLog metode på vores regel. Så ringer vi simpelthen getLog at få teksten skrevet til System.out siden vi ringede aktivere log.

Denne regel inkluderer også en praktisk metode, der returnerer en log, der altid har linjeseparatoren som \ n

Assert.assertEquals ("Hej Baeldung-læsere !! \ n", systemOutRule.getLogWithNormalizedLineSeparator ());

5. Brug af systemregler med JUnit5 og Lambdas

I JUnit5 blev reglermodellen erstattet af udvidelser. Heldigvis har systemregelbiblioteket, der er præsenteret i det sidste afsnit, en variant klar til at arbejde med JUnit5.

System Lambda fås fra Maven Central. Så vi kan gå videre og føje det til vores pom.xml:

 com.github.stefanbirkner system-lambda 1.0.0 test 

Lad os nu implementere vores test ved hjælp af denne version af biblioteket:

@Test ugyldigt givenTapSystemOut_whenInvokePrintln_thenOutputIsReturnedSuccessfully () kaster undtagelse {String text = tapSystemOut (() -> {print ("Hello Baeldung Readers !!");}); Assert.assertEquals ("Hej Baeldung-læsere !!", text.trim ()); }

I denne version, vi gør brug af tryk på SystemOut metode, der udfører erklæringen og lader os fange det indhold, der sendes til System.out.

6. Konklusion

I denne vejledning har vi lært om et par metoder til test System.out.println. I den første tilgang så vi, hvordan man omdirigerer, hvor vi skriver standardoutputstrømmen ved hjælp af Java-kernen.

Derefter så vi, hvordan man bruger et lovende eksternt bibliotek kaldet Systemregler ved hjælp af først JUnit 4-stilregler og derefter senere arbejde med lambdas.

Som altid er artiklens fulde kildekode tilgængelig på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found