Introduktion til AssertJ

Denne artikel er en del af en serie: • Introduktion til AssertJ (nuværende artikel) • AssertJ for Guava

• AssertJs Java 8-funktioner

• Brugerdefinerede påstande med AssertJ

1. Oversigt

I denne artikel vil vi udforske AssertJ - et open source-community-drevet bibliotek, der bruges til at skrive flydende og rige påstande i Java-tests.

Denne artikel fokuserer på værktøjer, der er tilgængelige i det basale AssertJ-modul kaldet AssertJ-kerne.

2. Maven afhængigheder

For at bruge AssertJ skal du medtage følgende afsnit i din pom.xml fil:

 org.assertj assertj-core 3.4.1 test 

Denne afhængighed dækker kun de grundlæggende Java-påstande. Hvis du vil bruge avancerede påstande, skal du tilføje yderligere moduler separat.

Bemærk, at du til Java 7 og tidligere skal bruge AssertJ-kerneversion 2.x.x.

Seneste versioner kan findes her.

3. Introduktion

AssertJ giver et sæt klasser og hjælpemetoder, der giver os mulighed for let at skrive flydende og smukke påstande om:

  • Standard Java
  • Java 8
  • Guava
  • Joda Time
  • Neo4J og
  • Sving komponenter

En detaljeret liste over alle moduler er tilgængelig på projektets hjemmeside.

Lad os starte med et par eksempler lige fra AssertJs dokumentation:

assertThat (frodo) .isNotEqualTo (sauron) .isIn (fellowshipOfTheRing); assertThat (frodo.getName ()) .startsWith ("Fro") .endsWith ("do") .isEqualToIgnoringCase ("frodo"); assertThat (fellowshipOfTheRing) .hasSize (9) .contains (frodo, sam) .doesNotContain (sauron);

Ovenstående eksempler er kun toppen af ​​isbjerget, men giv os et overblik over, hvordan skriftlige påstande med dette bibliotek kan se ud.

4. AssertJ i aktion

I dette afsnit vil vi fokusere på at oprette AssertJ og udforske dens muligheder.

4.1. Kom godt i gang

Med krukken på biblioteket på en klassesti er det lige så let at aktivere påstande som at tilføje en enkelt statisk import til din testklasse:

importer statisk org.assertj.core.api.Assertions. *;

4.2. Skrivende påstande

For at skrive en påstand skal du altid starte med at videregive dit objekt til Assertions.assertThat () metode, og derefter følger du med de faktiske påstande.

Det er vigtigt at huske, at i modsætning til andre biblioteker hævder koden nedenfor faktisk ikke noget endnu og vil aldrig mislykkes en test:

hævder, at (anyRefenceOrValue);

Hvis du udnytter din IDEs kodefærdiggørelsesfunktioner, bliver det utroligt nemt at skrive AssertJ-påstande på grund af dets meget beskrivende metoder. Sådan ser det ud i IntelliJ IDEA 16:

IDE's kodefærdiggørelsesfunktioner

Som du kan se, har du snesevis af kontekstuelle metoder at vælge imellem, og de er kun tilgængelige for Snor type. Lad os udforske i detaljer nogle af denne API og se på nogle specifikke påstande.

4.3. Objekt Påstande

Objekter kan sammenlignes på forskellige måder enten for at bestemme lighed mellem to objekter eller for at undersøge et objekts felter.

Lad os se på to måder, hvorpå vi kan sammenligne lighed mellem to objekter. Givet følgende to Hund genstande fido og fidosClone:

offentlig klasse Hund {privat strengnavn; privat flydevægt; // standard getters and setters} Dog fido = new Dog ("Fido", 5.25); Hund fidosClone = ny hund ("Fido", 5.25);

Vi kan sammenligne ligestilling med følgende påstand:

hævder, at (fido) .isEqualTo (fidosClone);

Dette vil mislykkes som er lig med() sammenligner objektreferencer. Hvis vi i stedet vil sammenligne deres indhold, kan vi bruge dem isEqualToComparingFieldByFieldRecursively () ligesom:

hævder, at (fido). er lig med sammenligningFieldByFieldRecursively (fidosClone);

Fido og fidosClone er ens, når der udføres et rekursivt felt ved felt sammenligning, fordi hvert felt i et objekt sammenlignes med feltet i det andet objekt.

Der er mange andre påstandsmetoder, der giver forskellige måder at sammenligne og kontrahere objekter på og undersøge og hævde på deres felter. For at opdage dem alle henvises til embedsmanden AbstractObjectAssert dokumentation.

4.4. Boolsk Påstande

Der findes nogle enkle metoder til sandhedstest:

  • er sandt()
  • isFalse ()

Lad os se dem i aktion:

assertThat ("". erEmpty ()). isTrue ();

4.5. Iterabel / Array Påstande

Til en Iterabel eller en Array der er flere måder at hævde, at deres indhold findes. En af de mest almindelige påstande ville være at kontrollere, om en Iterabel eller Array indeholder et givet element:

Liste liste = Arrays.asList ("1", "2", "3"); assertThat (liste) .contains ("1");

eller hvis en Liste er ikke tom:

assertThat (liste) .isNotEmpty ();

eller hvis en Liste starter med en given karakter. For eksempel “1”:

assertThat (liste). starter med ("1");

Husk, at hvis du vil oprette mere end en påstand for det samme objekt, kan du nemt slutte dem sammen.

Her er et eksempel på en påstand, der kontrollerer, om en given liste ikke er tom, indeholder "1" -element, ikke indeholder nogen nuller og indeholder en række af elementerne "2", "3":

assertThat (liste) .isNotEmpty () .contains ("1"). gørNotContainNull () .containsSequence ("2", "3");

Naturligvis findes der mange flere mulige påstande om disse typer. For at opdage dem alle henvises til embedsmanden AbstraktIterabelAssert dokumentation.

4.6. Karakter Påstande

Påstande om karaktertyper involverer for det meste sammenligninger og endda kontrol af, om en given karakter er fra en Unicode bord.

Her er et eksempel på en påstand, der kontrollerer, om et givet tegn ikke er 'a', er i Unicode-tabel, er større end 'b' og er med små bogstaver:

assertThat (someCharacter) .isNotEqualTo ('a') .inUnicode () .isGreaterThanOrEqualTo ('b') .isLowerCase ();

For en detaljeret liste over alle karaktertypers påstande, se AbstractCharacterAssert dokumentation.

4.7. Klasse Påstande

Påstande for Klasse type handler mest om at kontrollere dens felter, Klasse typer, tilstedeværelse af annoteringer og klassefinalitet.

Hvis du vil hævde den klasse Kan køres er en grænseflade, skal du blot skrive:

assertThat (Runnable.class) .isInterface ();

eller hvis du vil kontrollere, om den ene klasse kan tildeles fra den anden:

assertThat (Exception.class) .isAssignableFrom (NoSuchElementException.class);

Alt muligt Klasse påstande kan ses i AbstraktKlasseAssert dokumentation.

4.8. Fil Påstande

Fil påstande handler om at kontrollere, om en given Fil forekomst findes, er en mappe eller en fil, har bestemt indhold, kan læses eller har givet udvidelse.

Her kan du se et eksempel på en påstand, der kontrollerer, om en given fil findes, er fil og ikke en mappe, kan være læsbar og skrivbar:

 assertThat (someFile) .eksisterer () .isFile () .canRead () .canWrite ();

Alle mulige klassepåståelser kan ses i AbstraktFilAssert dokumentation.

4.9. Dobbelt / flydende / heltal Påstande

Dobbelt / flydende / heltal og andre Nummer Typer

Numeriske påstande handler om at sammenligne numeriske værdier inden for eller uden en given forskydning. For eksempel, hvis du vil kontrollere, om to værdier er ens i henhold til en given præcision, kan vi gøre følgende:

assertThat (5.1) .isEqualTo (5, withPrecision (1d));

Bemærk, at vi bruger allerede importeret withPrecision (dobbelt offset) hjælper metode til generering Offset genstande.

For flere påstande, besøg AbstractDoubleAssert dokumentation.

4.10. InputStream Påstande

Der er kun én InputStream-specifik påstand tilgængelig:

  • hasSameContentAs (forventet InputStream)

og i aktion:

assertThat (given) .hasSameContentAs (forventet);

4.11. Kort Påstande

Kort påstande giver dig mulighed for at kontrollere, om et kort indeholder en bestemt indtastning, et sæt indgange eller nøgler / værdier separat.

Og her kan du se et eksempel på påstande, der kontrollerer, om et givet kort ikke er tomt, indeholder numerisk tast "2", ikke indeholder numerisk tast "10" og indeholder indtastning: tast: 2, værdi: “a”:

assertThat (kort) .isNotEmpty () .containsKey (2). gørNotContainKeys (10) .contains (post (2, "a"));

For flere påstande, se AbstractMapAssert dokumentation.

4.12. Kan kastes Påstande

Kan kastes påstande tillader f.eks .: inspektion af undtagelsens meddelelser, stacktraces, årsag til kontrol eller verificering af, om en undtagelse allerede er blevet kastet.

Lad os se på eksemplet på en påstand, der kontrollerer, om en given undtagelse blev kastet og har en besked, der slutter med "c":

assertThat (ex) .hasNoCause (). hasMessageEndingWith ("c");

For flere påstande, se AbstractThrowableAssert dokumentation.

5. Beskrive påstande

For at opnå endnu højere detaljerethed kan du oprette dynamisk genererede brugerdefinerede beskrivelser til dine påstande. Nøglen til at gøre dette er as (strengbeskrivelse, objekt ... args) metode.

Hvis du definerer din påstand som denne:

assertThat (person.getAge ()). som ("% s alder skal være lig med 100", person.getName ()) .isEqualTo (100);

dette er hvad du får, når du kører tests:

[Alexs alder skulle være lig med 100] forventet: men var:

6. Java 8

AssertJ drager fuld fordel af Java 8s funktionelle programmeringsfunktioner. Lad os dykke ned i et eksempel og se det i aktion. Lad os først se, hvordan vi gør det i Java 7:

assertThat (fellowshipOfTheRing) .filteredOn ("race", HOBBIT) .containsOnly (sam, frodo, pippin, merry);

Her filtrerer vi en samling på løbet Hobbit, og i Java 8 kan vi gøre noget som dette:

assertThat (fellowshipOfTheRing) .filteredOn (karakter -> character.getRace (). er lig med (HOBBIT)). indeholder Only (sam, frodo, pippin, glædelig);

Vi vil udforske AssertJs Java8-funktioner i en fremtidig artikel fra denne serie. Ovenstående eksempler er hentet fra AssertJs hjemmeside.

7. Konklusion

I denne artikel udforskede vi kort de muligheder, AssertJ giver os sammen med de mest populære påstande om centrale Java-typer.

Implementeringen af ​​alle eksemplerne og kodestykkerne kan findes i et GitHub-projekt.

Næste » AssertJ for Guava