Tvrdnje u JUnit 4 i JUnit 5

1. Uvod

U ovom ćemo članku detaljno istražiti tvrdnje dostupne u JUnit-u.

Nakon migracije s JUnit 4 na JUnit 5 i Vodiča kroz JUnit 5 članke, sada ulazimo u detalje o različitim tvrdnjama dostupnim u JUnit 4 i JUnit 5.

Također ćemo istaknuti poboljšanja napravljena na tvrdnjama s JUnit 5.

2. Tvrdnje

Tvrdnje su korisne metode koje podržavaju utvrđivanje uvjeta u testovima; ove metode su dostupne putem Tvrditi razreda, u JUnit 4, i Tvrdnje jedan, u JUnit 5.

Kako bi se povećala čitljivost testa i samih tvrdnji, uvijek se preporučuje uvoz statički odnosna klasa. Na taj se način možemo izravno osvrnuti na samu metodu tvrdnje bez klase koja predstavlja kao prefiks.

Počnimo istraživati ​​tvrdnje dostupne s JUnit 4.

3. Tvrdnje u JUnit-u 4

U ovoj verziji knjižnice dostupne su tvrdnje za sve primitivne tipove, Predmeti, i nizovi (bilo primitiva ili Predmeti).

Redoslijed parametara, u okviru tvrdnje, je očekivana vrijednost nakon koje slijedi stvarna vrijednost; po želji prvi parametar može biti a Niz poruka koja predstavlja izlaz poruke procijenjenog stanja.

Postoji samo jedan malo drugačiji način definiranja ustvrdiTo tvrdnje, ali pokrenut ćemo to kasnije.

Počnimo s assertEquals jedan.

3.1. assertEquals

The assertEquals tvrdnja potvrđuje da su očekivane i stvarne vrijednosti jednake:

@Test public void whenAssertingEquality_thenEqual () {String očekuje = "Baeldung"; Stvarni niz = "Baeldung"; assertEquals (očekivano, stvarno); }

Također je moguće odrediti poruku koja će se prikazivati ​​kada tvrdnja ne uspije:

assertEquals ("neuspjeh - nizovi nisu jednaki", očekivani, stvarni);

3.2. assertArrayEquals

Ako želimo ustvrditi da su dva niza jednaka, možemo koristiti assertArrayEquals:

@Test public void whenAssertingArraysEquality_thenEqual () {char [] očekuje se = {'J', 'u', 'n', 'i', 't'}; char [] stvarni = "Junit" .toCharArray (); assertArrayEquals (očekivano, stvarno); }

Ako su oba niza null, tvrdnja će ih smatrati jednakima:

@Test javna praznina givenNullArrays_whenAssertingArraysEquality_thenEqual () {int [] očekuje se = null; int [] stvarno = null; assertArrayEquals (očekivano, stvarno); }

3.3. assertNotNull i potvrditiNull

Kada želimo testirati je li objekt null možemo koristiti potvrditiNull tvrdnja:

@Test public void whenAssertingNull_thenTrue () {Object car = null; assertNull ("Auto bi trebao biti null", auto); }

Suprotno tome, ako želimo ustvrditi da objekt ne smije biti ništavan, možemo koristiti assertNotNull tvrdnja.

3.4. assertNotSame i ustvrditiIsto

S assertNotSame, moguće je provjeriti ne odnose li se dvije varijable na isti objekt:

@Test public void whenAssertingNotSameObject_thenDifferent () {Object cat = new Object (); Object dog = novi Object (); assertNotSame (mačka, pas); }

Inače, kada želimo provjeriti odnose li se dvije varijable na isti objekt, možemo koristiti ustvrditiIsto tvrdnja.

3.5. assertTrue i assertFalse

U slučaju da želimo provjeriti je li određeni uvjet pravi ili lažno, odnosno možemo koristiti assertTrue tvrdnja ili assertFalse jedan:

@Test public void whenAssertingConditions_thenVerified () {assertTrue ("5 je veće od 4", 5> 4); assertFalse ("5 nije veće od 6", 5> 6); }

3.6. iznevjeriti

The iznevjeriti tvrdnja ne uspije test bacajući AssertionFailedError. Može se koristiti za provjeru je li izbačena stvarna iznimka ili kada želimo napraviti test koji nije uspio tijekom njegovog razvoja.

Pogledajmo kako ga možemo koristiti u prvom scenariju:

@Test public void whenCheckingExceptionMessage_thenEqual () {try {methodThatShouldThrowException (); neuspjeh ("Iznimka nije bačena"); } catch (UnsupportedOperationException e) {assertEquals ("Operacija nije podržana", e.getMessage ()); }}

3.7. ustvrdiTo

The ustvrdiTo tvrdnja je jedina u JUnit 4 koja ima obrnuti redoslijed parametara u usporedbi s ostalim tvrdnjama.

U ovom slučaju, tvrdnja ima opcionalnu poruku o neuspjehu, stvarnu vrijednost i a Podudaranje objekt.

Pogledajmo kako pomoću ove tvrdnje možemo provjeriti sadrži li niz određene vrijednosti:

@Test public void testAssertThatHasItems () {assertThat (Arrays.asList ("Java", "Kotlin", "Scala"), hasItems ("Java", "Kotlin")); } 

Dodatne informacije o snažnoj upotrebi ustvrdiTo tvrdnja sa Podudaranje objekt, dostupan je na Testing with Hamcrest.

4. JUNIT 5 Tvrdnje

JUnit 5 zadržao je mnoge metode tvrđenja JUnit 4, dodajući pritom nekoliko novih koji koriste prednost podrške Java 8.

Također su u ovoj verziji knjižnice dostupne tvrdnje za sve primitivne tipove, Predmeti, i nizovi (bilo primitiva bilo Objekata).

Redoslijed parametara tvrdnji se promijenio, premještajući parametar izlazne poruke kao zadnji parametar. Zahvaljujući podršci Jave 8, izlazna poruka može biti Dobavljač, dopuštajući lijenu procjenu toga.

Počnimo s pregledom tvrdnji dostupnih također u JUnit 4.

4.1. assertArrayEquals

The assertArrayEquals tvrdnja potvrđuje da su očekivani i stvarni nizovi jednaki:

@Test public void whenAssertingArraysEquality_thenEqual () {char [] očekuje se = {'J', 'u', 'p', 'i', 't', 'e', ​​'r'}; char [] stvarni = "Jupiter" .toCharArray (); assertArrayEquals (očekivano, stvarno, "Nizovi trebaju biti jednaki"); }

Ako nizovi nisu jednaki, poruka „Nizovi bi trebali biti jednaki”Prikazat će se kao izlaz.

4.2. assertEquals

U slučaju da želimo ustvrditi to dvoje pluta su jednaki, možemo koristiti jednostavno assertEquals tvrdnja:

@Test javna praznina whenAssertingEquality_thenEqual () {float square = 2 * 2; plutajući pravokutnik = 2 * 2; assertEquals (kvadrat, pravokutnik); }

Međutim, ako želimo ustvrditi da se stvarna vrijednost razlikuje od unaprijed definirane delte od očekivane vrijednosti, još uvijek možemo koristiti assertEquals ali delta vrijednost moramo proslijediti kao treći parametar:

@Test public void whenAssertingEqualityWithDelta_thenEqual () {float square = 2 * 2; plutajući pravokutnik = 3 * 2; plutajuća delta = 2; assertEquals (kvadrat, pravokutnik, delta); }

4.3. assertTrue i assertFalse

Uz assertTrue tvrdeći, moguće je provjeriti jesu li isporučeni uvjeti pravi:

@Test public void whenAssertingConditions_thenVerified () {assertTrue (5> 4, "5 je veće od 4"); assertTrue (null == null, "null je jednako null"); }

Zahvaljujući podršci lambda izraza, moguće je isporučiti a BooleanSupplier na tvrdnju umjesto a boolean stanje.

Pogledajmo kako možemo ustvrditi ispravnost a BooleanSupplier koristiti assertFalse tvrdnja:

@Test javna praznina givenBooleanSupplier_whenAssertingCondition_thenVerified () {BooleanSupplier condition = () -> 5> 6; assertFalse (uvjet, "5 nije veće od 6"); }

4.4. potvrditiNull i assertNotNull

Kad želimo ustvrditi da objekt nije null možemo koristiti assertNotNull tvrdnja:

@Test public void whenAssertingNotNull_thenTrue () {Object dog = new Object (); assertNotNull (dog, () -> "Pas ne bi trebao biti null"); }

Na suprotan način, možemo koristiti potvrditiNull tvrdnja da se provjeri je li stvarna null:

@Test public void whenAssertingNull_thenTrue () {Object cat = null; assertNull (cat, () -> "Mačka bi trebala biti null"); }

U oba slučaja, poruka o neuspjehu dobit će se na lijen način jer je to Dobavljač.

4.5. ustvrditiIsto i assertNotSame

Kada želimo ustvrditi da se očekivano i stvarno odnose na isto Objekt, moramo koristiti ustvrditiIsto tvrdnja:

@Test public void whenAssertingSameObject_thenSuccessfull () {Jezik niza = "Java"; Izborno neobavezno = Neobvezno.of (jezik); assertSame (language, optional.get ()); }

Na suprotan način, možemo koristiti assertNotSame jedan.

4.6. iznevjeriti

The iznevjeriti tvrdnja ne uspije na testu s priloženom porukom o neuspjehu kao i osnovnim uzrokom. Ovo može biti korisno za označavanje testa kada nije završen:

@Test public void whenFailingATest_thenFailed () {// Test nije dovršen neuspješno ("FAIL - test not completed"); }

4.7. potvrditiSve

Jedna od novih tvrdnji uvedenih u JUnit 5 je potvrditiSve.

Ova tvrdnja omogućuje stvaranje grupiranih tvrdnji, gdje se sve tvrdnje izvršavaju i njihovi neuspjesi prijavljuju zajedno. U pojedinostima, ova tvrdnja prihvaća naslov koji će biti uključen u niz poruka za MultipleFailureErrori a Stream od Izvršno.

Definirajmo grupiranu tvrdnju:

@Test javna praznina givenMultipleAssertion_whenAssertingAll_thenOK () {assertAll ("heading", () -> assertEquals (4, 2 * 2, "4 je 2 puta 2"), () -> assertEquals ("java", "JAVA" .toLowerCase ()), () -> assertEquals (null, null, "null je jednako null")); }

Izvršenje grupirane tvrdnje prekida se samo kad jedan od izvršnih programa izuzme izuzetak s crne liste (OutOfMemoryError na primjer).

4.8. assertIterableEquals

The assertIterableEquals tvrdi da su očekivani i stvarni ponovljivi postupci duboko jednaki.

Da bi bili jednaki, oba iterabilna elementa moraju vraćati jednake elemente istim redoslijedom i nije potrebno da su dva iterablea iste vrste da bi bila jednaka.

Uz ovo razmatranje, pogledajmo kako možemo ustvrditi da su dva popisa različitih vrsta (LinkedList i ArrayList na primjer) jednaki su:

@Test javna praznina givenTwoLists_whenAssertingIterables_thenEquals () {Iterable al = new ArrayList (asList ("Java", "Junit", "Test")); Iterable ll = new LinkedList (asList ("Java", "Junit", "Test")); assertIterableEquals (al, ll); }

Na isti način assertArrayEquals, ako su obje iterable null, smatraju se jednakima.

4.9. assertLinesMatch

The assertLinesMatch tvrdi da je očekivani popis Niz odgovara stvarnom popisu.

Ova se metoda razlikuje od assertEquals i assertIterableEquals budući da za svaki par očekivanih i stvarnih linija izvodi ovaj algoritam:

  1. provjerite je li očekivana crta jednaka stvarnoj. Ako je odgovor da, nastavlja se sa sljedećim parom
  2. tretirati očekivanu liniju kao regularni izraz i vrši provjeru s Niz.podudaranja () metoda. Ako je odgovor da, nastavlja se sa sljedećim parom
  3. provjerite je li očekivana linija oznaka za brzo premotavanje unaprijed. Ako je odgovor pozitivan, primijenite premotavanje unaprijed i ponovite algoritam iz koraka 1

Pogledajmo kako možemo koristiti ovu tvrdnju da ustvrdimo ta dva popisa Niz imaju odgovarajuće linije:

@Test public void whenAssertingEqualityListOfStrings_thenEqual () {Popis očekivanih = asList ("Java", "\ d +", "JUnit"); Popis stvarnih = asList ("Java", "11", "JUnit"); assertLinesMatch (očekivano, stvarno); }

4.10. assertNotEquals

Dopunjuje assertEquals, assertNotEquals tvrdnja tvrdi da očekivane i stvarne vrijednosti nisu jednake:

@Test public void whenAssertingEquality_thenNotEqual () {Integer value = 5; // rezultat algoritma assertNotEquals (0, vrijednost, "Rezultat ne može biti 0"); }

Ako su oboje null, tvrdnja ne uspijeva.

4.11. assertThrows

Kako bi se povećala jednostavnost i čitljivost, novi assertThrows tvrdnja nam omogućuje jasan i jednostavan način da utvrdimo ako izvršna datoteka baca navedenu vrstu iznimke.

Pogledajmo kako možemo ustvrditi izbačenu iznimku:

@Test void whenAssertingException_thenThrown () {Throwable iznimka = assertThrows (IllegalArgumentException.class, () -> {baciti novi IllegalArgumentException ("poruka o iznimci");}); assertEquals ("Poruka o iznimci", iznimka.getMessage ()); }

Tvrdnja neće uspjeti ako se ne izuzme izuzetak ili ako se izuzme izuzetak druge vrste.

4.12. assertTimeout i assertTimeoutPreemprative

U slučaju da želimo ustvrditi da je izvršenje isporučenog Izvršno završava prije zadanog Pauza, možemo koristiti assertTimeout tvrdnja:

@Test public void whenAssertingTimeout_thenNotExceeded () {assertTimeout (ofSeconds (2), () -> {// kôd kojem je potrebno manje od 2 minute za izvršavanje Thread.sleep (1000);}); }

Međutim, s assertTimeout tvrdeći, isporučena izvršna datoteka izvršit će se u istoj niti pozivnog koda. Slijedom toga, izvršenje dobavljača neće se preventivno prekinuti ako se prekorači vremensko ograničenje.

U slučaju da želimo biti sigurni da će se izvršenje izvršne datoteke prekinuti kada premaši vremensko ograničenje, možemo koristiti assertTimeoutPreemprative tvrdnja.

Obje tvrdnje mogu prihvatiti, umjesto Izvršno, a ThrowingSupplier, predstavljajući bilo koji generički blok koda koji vraća objekt i koji potencijalno može baciti Bacljivo.

5. Zaključak

U ovom smo tutorijalu pokrili sve tvrdnje dostupne u JUnit 4 i JUnit 5.

Ukratko smo istakli poboljšanja izvršena u JUnit 5, uvođenjem novih tvrdnji i podrškom lambda.

Kao i uvijek, cjeloviti izvorni kod za ovaj članak dostupan je na GitHubu.