Påstande i JUnit 4 og JUnit 5

1. Introduktion

I denne artikel vil vi i detaljer udforske de påstande, der er tilgængelige inden for JUnit.

Efter overgangen fra JUnit 4 til JUnit 5 og en guide til JUnit 5-artikler går vi nu ind på detaljer om de forskellige påstande, der er tilgængelige i JUnit 4 og JUnit 5.

Vi fremhæver også forbedringerne foretaget på påstandene med JUnit 5.

2. Påstande

Påstande er hjælpemetoder til understøttelse af påstande i test; disse metoder er tilgængelige via Hævde klasse i JUnit 4 og Påstande en i JUnit 5.

For at øge læsbarheden af ​​testen og selve påstandene anbefales det altid at importere statisk den respektive klasse. På denne måde kan vi henvise direkte til selve påstandsmetoden uden den repræsentative klasse som et præfiks.

Lad os begynde at udforske de påstande, der er tilgængelige med JUnit 4.

3. Påstande i JUnit 4

I denne version af biblioteket er påstande tilgængelige for alle primitive typer, Objekter, og arrays (enten af ​​primitiver eller Objekter).

Parameterrækkefølgen inden for påstanden er den forventede værdi efterfulgt af den aktuelle værdi; valgfrit kan den første parameter være en Snor besked, der repræsenterer meddelelsesoutputtet for den evaluerede tilstand.

Der er kun en lidt anderledes i, hvordan defineres hævder det påstande, men vi dækker det senere.

Lad os starte med hævderLige en.

3.1. hævderLige

Det hævderLige påstand bekræfter, at de forventede og de faktiske værdier er ens:

@Test offentlig ugyldig nårAssertingEquality_thenEqual () {String forventet = "Baeldung"; String actual = "Baeldung"; assertEquals (forventet, faktisk); }

Det er også muligt at specificere en besked, der skal vises, når påstanden mislykkes:

assertEquals ("fiasko - strenge er ikke ens", forventet, faktisk);

3.2. assertArrayEquals

Hvis vi vil hævde, at to arrays er lige, kan vi bruge assertArrayEquals:

@Test offentligt ugyldigt nårAssertingArraysEquality_thenEqual () {char [] forventet = {'J', 'u', 'n', 'i', 't'}; char [] actual = "Junit" .toCharArray (); assertArrayEquals (forventet, faktisk); }

Hvis begge arrays er nulpåstanden vil betragte dem som lige:

@Test offentlig ugyldighed givenNullArrays_whenAssertingArraysEquality_thenEqual () {int [] forventet = null; int [] faktisk = null; assertArrayEquals (forventet, faktisk); }

3.3. hævderNotNull og hævder Null

Når vi vil teste, om et objekt er nul vi kan bruge hævder Null påstand:

@Test offentlig ugyldig nårAssertingNull_thenTrue () {Objektbil = null; assertNull ("Bilen skal være nul", bil); }

På den modsatte måde, hvis vi vil hævde, at et objekt ikke skal være null, kan vi bruge assertNotNull påstand.

3.4. assertNotSame og hævderSamme

Med assertNotSame, er det muligt at kontrollere, om to variabler ikke henviser til det samme objekt:

@Test offentlig ugyldig nårAssertingNotSameObject_thenDifferent () {Object cat = new Object (); Objekt hund = nyt objekt (); assertNotSame (kat, hund); }

Ellers, når vi vil kontrollere, at to variabler henviser til det samme objekt, kan vi bruge hævderSamme påstand.

3.5. hævder sandt og hævder Falsk

Hvis vi vil kontrollere, at en bestemt tilstand er rigtigt eller falsk, kan vi henholdsvis bruge hævder sandt påstand eller hævder Falsk en:

@Test offentlig ugyldig nårAssertingConditions_thenVerified () {assertTrue ("5 er større end 4", 5> 4); assertFalse ("5 er ikke større end 6", 5> 6); }

3.6. svigte

Det svigte påstand mislykkes en test, der kaster en AssertionFailedError. Det kan bruges til at kontrollere, at en faktisk undtagelse kastes, eller når vi vil lave en test, der fejler under dens udvikling.

Lad os se, hvordan vi kan bruge det i det første scenario:

@Test offentlig ugyldig nårCheckingExceptionMessage_thenEqual () {prøv {methodThatShouldThrowException (); fail ("Undtagelse ikke kastet"); } fange (UnsupportedOperationException e) {assertEquals ("Operation Not Supported", e.getMessage ()); }}

3.7. hævder det

Det hævder det påstand er den eneste i JUnit 4, der har en omvendt rækkefølge af parametrene sammenlignet med de andre påstande.

I dette tilfælde har påstanden en valgfri fejlmeddelelse, den aktuelle værdi og en Matcher objekt.

Lad os se, hvordan vi kan bruge denne påstand til at kontrollere, om en matrix indeholder bestemte værdier:

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

Yderligere oplysninger om den kraftige anvendelse af hævder det påstand med Matcher objekt, er tilgængelig på Testing with Hamcrest.

4. JUnit 5 påstande

JUnit 5 bevarede mange af påstandsmetoderne i JUnit 4, mens de tilføjede få nye, der udnytter Java 8-understøttelsen.

Også i denne version af biblioteket er påstande tilgængelige for alle primitive typer, Objekter, og arrays (enten af ​​primitiver eller objekter).

Rækkefølgen af ​​påstandens parametre blev ændret ved at flytte outputmeddelelsesparameteren som den sidste parameter. Takket være understøttelsen af ​​Java 8 kan outputbeskeden være en Leverandør, der tillader doven evaluering af det.

Lad os begynde at gennemgå de påstande, der er tilgængelige også i JUnit 4.

4.1. assertArrayEquals

Det assertArrayEquals påstand bekræfter, at de forventede og de faktiske arrays er lig med:

@Test offentligt ugyldigt nårAssertingArraysEquality_thenEqual () {char [] forventet = {'J', 'u', 'p', 'i', 't', 'e', ​​'r'}; char [] actual = "Jupiter" .toCharArray (); assertArrayEquals (forventet, faktisk, "Arrays skal være ens"); }

Hvis arrays ikke er ens, vises meddelelsen “Arrays skal være ens”Vises som output.

4.2. hævderLige

Hvis vi vil hævde de to flyder er lige, kan vi bruge det enkle hævderLige påstand:

@Test offentlig ugyldig nårAssertingEquality_thenEqual () {float square = 2 * 2; flyderektangel = 2 * 2; assertEquals (firkant, rektangel); }

Men hvis vi vil hævde, at den faktiske værdi adskiller sig med et foruddefineret delta fra den forventede værdi, kan vi stadig bruge hævderLige men vi skal videregive deltaværdien som den tredje parameter:

@Test offentligt ugyldigt nårAssertingEqualityWithDelta_thenEqual () {float square = 2 * 2; flyderektangel = 3 * 2; flyde delta = 2; assertEquals (firkant, rektangel, delta); }

4.3. hævder sandt og hævder Falsk

Med hævder sandt påstand er det muligt at kontrollere, at de leverede betingelser er rigtigt:

@Test offentlig ugyldig nårAssertingConditions_thenVerified () {assertTrue (5> 4, "5 er større end 4"); assertTrue (null == null, "null er lig med null"); }

Takket være understøttelsen af ​​lambda-udtrykket er det muligt at levere en Boolsk leverandør til påstanden i stedet for en boolsk tilstand.

Lad os se, hvordan vi kan hævde rigtigheden af ​​en Boolsk leverandør bruger hævder Falsk påstand:

@Test offentlig ugyldighed givenBooleanSupplier_whenAssertingCondition_thenVerified () {BooleanSupplier condition = () -> 5> 6; assertFalse (betingelse, "5 er ikke større end 6"); }

4.4. hævder Null og hævderNotNull

Når vi vil hævde, at et objekt ikke er det nul vi kan bruge hævderNotNull påstand:

@Test offentligt ugyldigt nårAssertingNotNull_thenTrue () {Objekt hund = nyt objekt (); assertNotNull (hund, () -> "Hunden skal ikke være nul"); }

På den modsatte måde kan vi bruge hævder Null påstand om at kontrollere, om den faktiske er nul:

@Test offentlig ugyldig nårAssertingNull_thenTrue () {Object cat = null; assertNull (kat, () -> "Katten skal være nul"); }

I begge tilfælde vil fejlmeddelelsen blive hentet på en doven måde, da det er en Leverandør.

4.5. hævderSamme og assertNotSame

Når vi vil hævde, at det forventede og det faktiske henviser til det samme Objekt, vi skal bruge hævderSamme påstand:

@Test offentlig ugyldig nårAssertingSameObject_thenSuccessfull () {String sprog = "Java"; Valgfri valgfri = Valgfri. Af (sprog); assertSame (sprog, valgfri. get ()); }

På den modsatte måde kan vi bruge assertNotSame en.

4.6. svigte

Det svigte påstand mislykkes en test med den medfølgende fejlmeddelelse samt den underliggende årsag. Dette kan være nyttigt at markere en test, når dens udvikling ikke er afsluttet:

@Test offentlig ugyldig nårFailATest_thenFailed () {// Test ikke afsluttet mislykkedes ("FAIL - test ikke afsluttet"); }

4.7. hævderAlle

En af de nye påstande introduceret i JUnit 5 er hævderAlle.

Denne påstand tillader oprettelse af grupperede påstande, hvor alle påstandene udføres, og deres fejl rapporteres sammen. I detaljer accepterer denne påstand en overskrift, der vil blive inkluderet i meddelelsesstrengen for MultipleFailureErrorog en Strøm af Eksekverbar.

Lad os definere en grupperet påstand:

@Test offentlig ugyldighed givenMultipleAssertion_whenAssertingAll_thenOK () {assertAll ("heading", () -> assertEquals (4, 2 * 2, "4 is 2 times 2"), () -> assertEquals ("java", "JAVA" .toLowerCase ()), () -> assertEquals (null, null, "null er lig med null")); }

Udførelsen af ​​en grupperet påstand afbrydes kun, når en af ​​eksekverbare kaster en sortlistet undtagelse (OutOfMemoryError for eksempel).

4.8. assertIterableEquals

Det assertIterableEquals hævder, at de forventede og de faktiske iterables er dybt lige.

For at være ens skal begge iterable returnere lige elementer i samme rækkefølge, og det er ikke nødvendigt, at de to iterables er af samme type for at være ens.

Lad os med denne overvejelse se, hvordan vi kan hævde, at to lister af forskellige typer (LinkedList og ArrayList for eksempel) er ens:

@Test offentlig ugyldighed givenTwoLists_whenAssertingIterables_thenEquals () {Iterable al = new ArrayList (asList ("Java", "Junit", "Test")); Iterabel ll = ny LinkedList (asList ("Java", "Junit", "Test")); assertIterableEquals (al, ll); }

På samme måde som assertArrayEquals, hvis begge iterables er null, betragtes de som lige.

4.9. assertLinesMatch

Det assertLinesMatch hævder, at den forventede liste over Snor matcher den aktuelle liste.

Denne metode adskiller sig fra hævderLige og assertIterableEquals da det for hvert par forventede og faktiske linjer udfører denne algoritme:

  1. kontrollere, om den forventede linje er lig med den aktuelle. Hvis ja, fortsætter det med det næste par
  2. behandle den forventede linje som et regulært udtryk og udfører en kontrol med Snor.Tændstikker() metode. Hvis ja, fortsætter det med det næste par
  3. kontrollere, om den forventede linje er en hurtig fremad-markør. Hvis ja, anvend hurtigt fremad og gentag algoritmen fra trin 1

Lad os se, hvordan vi kan bruge denne påstand til at hævde, at to lister over Snor har matchende linjer:

@Test offentlig ugyldig nårAssertingEqualityListOfStrings_thenEqual () {List forventet = asList ("Java", "\ d +", "JUnit"); List actual = asList ("Java", "11", "JUnit"); assertLinesMatch (forventet, faktisk); }

4.10. assertNotEquals

Supplerende til hævderLige, det assertNotEquals påstand hævder, at de forventede og de faktiske værdier ikke er ens:

@Test offentlig ugyldig nårAssertingEquality_thenNotEqual () {Heltalsværdi = 5; // resultat af en algoritme assertNotEquals (0, værdi, "Resultatet kan ikke være 0"); }

Hvis begge er det nulpåstanden mislykkes.

4.11. hævder kaster

For at øge enkelhed og læsbarhed er den nye hævder kaster påstand giver os en klar og enkel måde at hævde, hvis en eksekverbar kaster den specificerede undtagelsestype.

Lad os se, hvordan vi kan hævde en kastet undtagelse:

@Test ugyldigt nårAssertingException_thenThrown () {Throwable exception = assertThrows (IllegalArgumentException.class, () -> {throw new IllegalArgumentException ("Exception message");}); assertEquals ("Undtagelsesmeddelelse", exception.getMessage ()); }

Påstanden mislykkes, hvis der ikke kastes nogen undtagelse, eller hvis en undtagelse af en anden type kastes.

4.12. assertTimeout og assertTimeoutForebyggende

Hvis vi vil hævde, at udførelsen af ​​en leveret Eksekverbar slutter før en given Tiden er gået, kan vi bruge assertTimeout påstand:

@Test offentlig ugyldig nårAssertingTimeout_thenNotExceeded () {assertTimeout (ofSeconds (2), () -> {// kode, der kræver mindre end 2 minutter at udføre Thread.sleep (1000);}); }

Dog med assertTimeout påstand, vil den medfølgende eksekverbare eksekveres i den samme tråd i opkaldskoden. Derfor afbrydes udførelsen af ​​leverandøren ikke forebyggende, hvis timeout overskrides.

Hvis vi vil være sikre på, at eksekvering af den eksekverbare fil afbrydes, når den overskrider timeout, kan vi bruge assertTimeoutForebyggende påstand.

Begge påstande kan accepteres i stedet for en Eksekverbar, -en ThrowingSupplier, der repræsenterer enhver generisk kodeblok, der returnerer et objekt, og som potentielt kan kaste et Kan kastes.

5. Konklusion

I denne vejledning dækkede vi alle de påstande, der er tilgængelige i både JUnit 4 og JUnit 5.

Vi fremhævede kort de forbedringer, der blev foretaget i JUnit 5 med introduktionen af ​​nye påstande og støtten fra lambdas.

Som altid er den komplette kildekode til denne artikel tilgængelig på GitHub.