Testovanie jednotiek System.out.println () s JUnit

1. Prehľad

Pri testovaní jednotiek môžeme občas chcieť otestovať správy, cez ktoré píšeme na štandardný výstup System.out.println ().

Aj keď by sme vo všeobecnosti uprednostňovali protokolovací rámec pred priamou interakciou so štandardným výstupom, niekedy to nie je možné.

V tomto rýchlom návode pozrieme sa na niekoľko spôsobov, ako môžeme testovať jednotky System.out.println () pomocou JUnit.

2. Jednoduchá metóda tlače

V celom tomto výučbe sa zameriame na naše testy na jednoduchú metódu, ktorá zapisuje do štandardného výstupného toku:

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

Krátka pripomienka, že von premenná je a verejné statické finále PrintStream objekt, ktorý predstavuje štandardný výstupný tok určený na použitie v celom systéme.

3. Práca s Core Java

Teraz sa pozrime, ako môžeme napísať test jednotky na kontrolu obsahu toho, čo odosielame do println metóda. Predtým, ako napíšeme náš skutočný test jednotky, budeme však musieť v našom teste vykonať určitú inicializáciu:

súkromná konečná PrintStream standardOut = System.out; private final ByteArrayOutputStream outputStreamCaptor = nový ByteArrayOutputStream (); @BeforeEach public void setUp () {System.setOut (nový PrintStream (outputStreamCaptor)); }

V nastaviť metódou, priradíme štandardný výstupný prúd k novému PrintStream s ByteArrayOutputStream. Keď uvidíme tento výstupný prúd, budú sa teraz tlačiť hodnoty:

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

Potom, čo zavoláme tlačiť metódu so zvoleným textom, potom môžeme overiť, či outputStreamCaptor obsahuje obsah, ktorý sme očakávali. Voláme obrezať metóda na odstránenie nového riadku, ktorý System.out.println () dodáva.

Keďže štandardný výstupný tok je zdieľaný statický prostriedok používaný inými časťami systému, po ukončení testu by sme sa mali postarať o jeho uvedenie do pôvodného stavu:

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

To zaisťuje, že neskôr v iných testoch nebudeme mať žiadne nežiaduce vedľajšie účinky.

4. Používanie systémových pravidiel

V tejto časti, sa pozrieme na úhľadnú externú knižnicu s názvom Systémové pravidlá, ktorá poskytuje sadu pravidiel JUnit na testovanie kódu, ktorý používa Systém trieda.

Začnime pridaním závislosti do našej pom.xml:

 com.github.stefanbirkner systémové pravidlá 1.19.0 test 

Teraz môžeme pokračovať a napísať test pomocou SystemOutRule knižnica poskytuje:

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

Celkom v pohode! Pomocou SystemOutRule, môžeme odpočúvať zápisy do System.out. Najskôr začneme zaznamenávať všetko, na čo je zapísané System.out zavolaním na enableLog metóda podľa nášho pravidla. Potom jednoducho zavoláme getLog aby ste napísali text System.out odkedy sme volali enableLog.

Toto pravidlo obsahuje aj užitočnú metódu, ktorá vráti protokol, ktorý má vždy oddeľovač riadkov ako \ n

Assert.assertEquals ("Ahoj čitatelia Baeldungu !! \ n", systemOutRule.getLogWithNormalizedLineSeparator ());

5. Používanie systémových pravidiel s JUnit5 a Lambdas

V JUnit5 bol model pravidiel nahradený rozšíreniami. Našťastie má knižnica systémových pravidiel uvedená v poslednej časti pripravenú variáciu na prácu s JUnit5.

Systém Lambda je k dispozícii od Maven Central. Takže môžeme pokračovať a pridať ju k našej pom.xml:

 test com.github.stefanbirkner system-lambda 1.0.0 

Teraz poďme implementovať náš test pomocou tejto verzie knižnice:

@Test void givenTapSystemOut_whenInvokePrintln_thenOutputIsReturnedSuccessfully () vyvolá výnimku {String text = tapSystemOut (() -> {print ("Hello Baeldung Readers !!");}); Assert.assertEquals ("Hello Baeldung Readers !!", text.trim ()); }

V tejto verzii využívame tapSystemOut metóda, ktorá vykoná príkaz a umožní nám zachytiť odovzdaný obsah System.out.

6. Záver

V tomto tutoriáli sme sa dozvedeli o niekoľkých prístupoch k testovaniu System.out.println. V prvom prístupe sme videli, ako presmerovať miesto, kde píšeme štandardný výstupný prúd, pomocou jadra Java.

Potom sme videli, ako používať nádejnú externú knižnicu s názvom Systémové pravidlá, najskôr pomocou pravidiel štýlu JUnit 4 a neskôr pomocou lambdas.

Celý zdrojový kód článku je ako vždy k dispozícii na GitHub.


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