Enhetstesting av System.out.println () med JUnit

1. Oversikt

Ved enhetstesting kan det hende at vi ønsker å teste meldingene vi skriver til standardutdata via System.out.println ().

Selv om vi generelt foretrekker et loggerammeverk fremfor direkte interaksjon med standardutdata, er det noen ganger ikke mulig.

I denne raske opplæringen, Vi tar en titt på et par måter vi kan teste enheten på System.out.println () ved hjelp av JUnit.

2. En enkel utskriftsmetode

Gjennom denne opplæringen vil fokuset på testene våre være en enkel metode som skriver til standard utgangsstrøm:

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

En rask påminnelse om at ute variabel er en offentlig statisk endelig PrintStream objekt som representerer standard utgangsstrøm beregnet for bruk over hele systemet.

3. Arbeide med Core Java

La oss nå se hvordan vi kan skrive en enhetstest for å sjekke innholdet av det vi sender til utskrift metode. Før vi skriver vår faktiske enhetstest, må vi imidlertid gi noen initialisering i testen:

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

I oppsett metoden, tilordner vi standard utgangsstrøm til en ny PrintStream med en ByteArrayOutputStream. Som vi skal se, er denne utgangsstrømmen der verdiene nå skal skrives ut:

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

Etter at vi kaller skrive ut metode med valgt tekst, kan vi deretter bekrefte at outputStreamCaptor inneholder innholdet vi forventet. Vi kaller listverk metode for å fjerne den nye linjen som System.out.println () legger til.

Siden standard utgangsstrøm er en delt statisk ressurs som brukes av andre deler av systemet, vi bør ta oss av å gjenopprette den til sin opprinnelige tilstand når testen avsluttes:

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

Dette sikrer at vi ikke får noen uønskede bivirkninger senere i andre tester.

4. Bruke systemregler

I denne seksjonen, Vi tar en titt på et pent eksternt bibliotek kalt Systemregler som gir et sett med JUnit-regler for testing av kode som bruker System klasse.

La oss starte med å legge avhengigheten til vår pom.xml:

 com.github.stefanbirkner system-regler 1.19.0 test 

Nå kan vi fortsette og skrive en test ved hjelp av SystemOutRule biblioteket gir:

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

Ganske kult! Bruker SystemOutRule, vi kan fange opp skrivene til System.out. Først begynner vi å logge alt skrevet til System.out ved å ringe enableLog metode på vår regel. Så ringer vi rett og slett getLog å få teksten skrevet til System.out siden vi ringte enableLog.

Denne regelen inkluderer også en praktisk metode som returnerer en logg som alltid har linjeskilleren som \ n

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

5. Bruke systemregler med JUnit5 og Lambdas

I JUnit5 ble reglemodellen erstattet av utvidelser. Heldigvis har systemregelbiblioteket som ble presentert i den siste delen en variant forberedt på å jobbe med JUnit5.

System Lambda er tilgjengelig fra Maven Central. Så vi kan fortsette og legge det til vårt pom.xml:

 com.github.stefanbirkner system-lambda 1.0.0 test 

La oss nå implementere testen vår ved hjelp av denne versjonen av biblioteket:

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

I denne versjonen, vi benytter oss av trykk på SystemOut metode, som kjører utsagnet og lar oss fange innholdet som sendes til System.out.

6. Konklusjon

I denne opplæringen har vi lært om et par tilnærminger for testing System.out.println. I den første tilnærmingen så vi hvordan vi omdirigerer hvor vi skriver standard utgangsstrøm ved hjelp av kjernen Java.

Så så vi hvordan vi kunne bruke et lovende eksternt bibliotek kalt Systemregler ved å bruke JUnit 4-stilregler, og deretter jobbe med lambdas.

Som alltid er hele kildekoden til artikkelen tilgjengelig på GitHub.


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