Jedinično testiranje System.out.println () s JUnit

1. Pregled

Pri jediničnom testiranju povremeno ćemo možda htjeti testirati poruke koje zapisujemo na standardni izlaz System.out.println ().

Iako bismo uglavnom preferirali logging framework od izravne interakcije sa standardnim izlazom, ponekad to nije moguće.

U ovom brzom vodiču, pogledati ćemo nekoliko načina na koje možemo jedinstveno testirati System.out.println () pomoću JUnit-a.

2. Jednostavna metoda ispisa

Kroz ovo uputstvo, fokus naših testova bit će jednostavna metoda koja zapisuje u standardni izlazni tok:

privatni void ispis (izlaz niza) {System.out.println (izlaz); } 

Brzi podsjetnik da van varijabla je a javni statički konačni PrintStream objekt koji predstavlja standardni izlazni tok namijenjen za uporabu u cijelom sustavu.

3. Rad s jezgrom Java

Sada da vidimo kako možemo napisati jedinični test za provjeru sadržaja onoga što šaljemo na println metoda. Međutim, prije nego što napišemo stvarni jedinični test, morat ćemo pružiti neke inicijalizacije u našem testu:

privatni konačni PrintStream standardOut = System.out; privatni konačni ByteArrayOutputStream outputStreamCaptor = novi ByteArrayOutputStream (); @BeforeEach public void setUp () {System.setOut (novi PrintStream (outputStreamCaptor)); }

U postaviti metodu, dodijeljujemo standardni izlazni tok novom PrintStream s ByteArrayOutputStream. Kao što ćemo vidjeti, u ovom će se izlaznom toku vrijednosti sada ispisivati:

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

Nakon što nazovemo ispis metodom s odabranim tekstom, tada možemo provjeriti je li outputStreamCaptor sadrži sadržaj koji smo očekivali. Mi zovemo podrezati metoda za uklanjanje nove linije koja System.out.println () dodaje.

Kako je standardni izlazni tok zajednički statički resurs koji koriste drugi dijelovi sustava, trebali bismo se pobrinuti za vraćanje u prvobitno stanje kada naš test završi:

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

To osigurava da kasnije u drugim testovima ne dobijemo neželjene nuspojave.

4. Korištenje sistemskih pravila

U ovom odjeljku, pogledati ćemo urednu vanjsku knjižnicu pod nazivom System Rules koja pruža skup JUnit pravila za testiranje koda koji koristi Sustav razred.

Počnimo dodavanjem ovisnosti na našu pom.xml:

 com.github.stefanbirkner test pravila sistema 1.19.0 

Sada možemo napisati test koristeći SystemOutRule knjižnica pruža:

@Rule javni konačni SystemOutRule systemOutRule = novi SystemOutRule (). EnableLog (); @Test javna praznina givenSystemOutRule_whenInvokePrintln_thenLogSuccess () {print ("Hello Baeldung Readers !!"); Assert.assertEquals ("Pozdrav čitateljima Baeldung !!", systemOutRule.getLog () .trim ()); }

Baš super! Koristiti SystemOutRule, možemo presresti zapise u System.out. Prvo započinjemo bilježenje svega napisanog System.out pozivom na enableLog metoda po našem pravilu. Tada jednostavno zovemo getLog da se tekst napiše na System.out otkad smo nazvali enableLog.

Ovo pravilo također uključuje praktičnu metodu koja vraća zapisnik koji uvijek ima separator reda kao \ n

Assert.assertEquals ("Pozdrav čitateljima Baeldung !! \ n", systemOutRule.getLogWithNormalizedLineSeparator ());

5. Korištenje sistemskih pravila s JUnit5 i Lambdas

U JUnit5 model pravila zamijenjen je proširenjima. Srećom, knjižnica sistemskih pravila predstavljena u posljednjem odjeljku ima varijaciju pripremljenu za rad s JUnit5.

Sustav Lambda dostupan je kod Maven Central. Tako da možemo nastaviti i dodati ga našem pom.xml:

 com.github.stefanbirkner system-lambda 1.0.0 test 

Sada ćemo implementirati naš test koristeći ovu verziju knjižnice:

@Test void givenTapSystemOut_whenInvokePrintln_thenOutputIsReturnedSuccessfully () baca iznimku {String text = tapSystemOut (() -> {print ("Hello Baeldung Readers !!");}); Assert.assertEquals ("Pozdrav čitateljima Baeldung !!", text.trim ()); }

U ovoj verziji, koristimo tapniteSustavOut metoda koja izvršava izjavu i omogućuje nam hvatanje sadržaja proslijeđenog System.out.

6. Zaključak

U ovom uputstvu naučili smo o nekoliko pristupa za testiranje System.out.println. U prvom pristupu vidjeli smo kako preusmjeriti tamo gdje pišemo standardni izlazni tok pomoću jezgre Java.

Tada smo vidjeli kako koristiti perspektivnu vanjsku knjižnicu koja se naziva Sistemska pravila koristeći, prvo, pravila stila JUnit 4, a zatim kasnije radeći s lambdama.

Kao i uvijek, puni izvorni kôd članka dostupan je na GitHub-u.