Java >> Java tutorial >  >> Tag >> assert

Introduktion til AssertJ

Denne artikel er en del af en serie:• Introduktion til AssertJ (aktuel artikel)• AssertJ for Guava
• AssertJs Java 8-funktioner
• Brugerdefinerede påstande med AssertJ

1. Oversigt

I denne artikel vil vi udforske AssertJ – et opensource-samfundsdrevet bibliotek, der bruges til at skrive flydende og fyldige påstande i Java-tests.

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

2. Maven Dependencies

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

<dependency>
    <groupId>org.assertj</groupId>
    <artifactId>assertj-core</artifactId>
    <version>3.4.1</version>
    <scope>test</scope>
</dependency>

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 til Java 7 og tidligere skal du bruge AssertJ kerneversion 2.x.x.

Seneste versioner kan findes her.

3. Introduktion

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

  • Standard Java
  • Java 8
  • Guava
  • Joda-tid
  • Neo4J og
  • Svingkomponenter

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

Lad os starte med et par eksempler lige fra AssertJ's 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 giver os et overblik over, hvordan skrivning af påstande med dette bibliotek kan se ud.

4. AssertJ i aktion

I dette afsnit vil vi fokusere på at opsætte AssertJ og udforske dets muligheder.

4.1. Kom godt i gang

Med bibliotekets jar på en klassesti er det lige så nemt at aktivere påstande som at tilføje en enkelt statisk import til din testklasse:

import static org.assertj.core.api.Assertions.*;

4.2. At skrive påstande

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

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

assertThat(anyRefenceOrValue);

Hvis du udnytter din IDE's kodefuldførelsesfunktioner, bliver det utrolig nemt at skrive AssertJ-påstande på grund af dets meget beskrivende metoder. Sådan ser det ud i IntelliJ IDEA 16:

IDE's kodefuldførelsesfunktioner

Som du kan se, har du snesevis af kontekstuelle metoder at vælge imellem, og de er kun tilgængelige for String type. Lad os se nærmere på noget 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 ligheden mellem to objekter. Givet de følgende to Hund objekter fido og fidosClone :

public class Dog { 
    private String name; 
    private Float weight;
    
    // standard getters and setters
}

Dog fido = new Dog("Fido", 5.25);

Dog fidosClone = new Dog("Fido", 5.25);

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

assertThat(fido).isEqualTo(fidosClone);

Dette vil mislykkes som isEqualTo() sammenligner objektreferencer. Hvis vi i stedet vil sammenligne deres indhold, kan vi bruge isEqualToComparingFieldByFieldRecursively() sådan:

assertThat(fido).isEqualToComparingFieldByFieldRecursively(fidosClone);

Fido og fidosClone er ens, når der foretages en rekursiv felt-for-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 til at undersøge og hævde på deres felter. For at finde dem alle, se den officielle AbstractObjectAssert dokumentation.

4.4. Boolean Påstande

Der findes nogle simple metoder til sandhedstestning:

  • isTrue()
  • isFalse()

Lad os se dem i aktion:

assertThat("".isEmpty()).isTrue();

4.5. Iterable/Array Påstande

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

List<String> list = Arrays.asList("1", "2", "3");

assertThat(list).contains("1");

eller hvis en Liste er ikke tom:

assertThat(list).isNotEmpty();

eller hvis en Liste starter med et givet tegn. For eksempel "1":

assertThat(list).startsWith("1");

Husk på, at hvis du vil oprette mere end én påstand for det samme objekt, kan du nemt kombinere dem.

Her er et eksempel på en påstand, der kontrollerer, om en angivet liste ikke er tom, indeholder "1" element, ikke indeholder nogen nuller og indeholder sekvens af elementer "2", "3":

assertThat(list)
  .isNotEmpty()
  .contains("1")
  .doesNotContainNull()
  .containsSequence("2", "3");

Selvfølgelig findes der mange flere mulige påstande for disse typer. For at finde dem alle, se den officielle AbstractIterableAssert dokumentation.

4.6. Karakter Påstande

Påstande for tegntyper involverer for det meste sammenligninger og endda kontrol af, om et givet tegn er fra en Unicode tabel.

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

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 tjekke dens felter, Klasse typer, tilstedeværelse af annoteringer og klassefinalitet.

Hvis du vil hævde den klasse Kørbar 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);

Alle mulige Klasser påstande kan ses i AbstractClassAssert dokumentation.

4.8. Fil Påstande

Fil påstande handler om at kontrollere, om en given fil instans eksisterer, er en mappe eller en fil, har bestemt indhold, er læsbar eller har givet filtypenavn.

Her kan du se et eksempel på en påstand, der kontrollerer om en given fil eksisterer, er fil og ikke en mappe, kan læses og skrives:

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

Alle mulige klassepåstande kan ses i AbstractFileAssert dokumentation.

4.9. Double/Float/Integer Påstande

Dobbelt/flydende/heltal og Andet Nummer Typer

Numeriske påstande handler om at sammenligne numeriske værdier inden for eller uden en given offset. 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 med præcision(dobbelt offset) hjælpemetode til at generere Offset genstande.

For flere påstande, besøg AbstractDoubleAssert-dokumentationen.

4.10. InputStream Påstande

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

  • hasSameContentAs(InputStream forventet)

og i aktion:

assertThat(given).hasSameContentAs(expected);

4.11. Kort Påstande

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

Og her kan du se et eksempel på en påstand, der kontrollerer, om et givet kort ikke er tomt, indeholder numerisk nøgle "2", ikke indeholder numerisk nøgle "10" og indeholder indtastning:nøgle:2, værdi:"a ” :

assertThat(map)
  .isNotEmpty()
  .containsKey(2)
  .doesNotContainKeys(10)
  .contains(entry(2, "a"));

For flere påstande, se AbstractMapAssert dokumentation.

4.12. Kan kastes Påstande

Kastelig påstande tillader f.eks.:inspicering af undtagelses meddelelser, stacktraces, årsagskontrol eller verificering af, om en undtagelse allerede er blevet kastet.

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

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

For flere påstande, se AbstractThrowableAssert-dokumentationen.

5. Beskrive påstande

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

Hvis du definerer din påstand sådan her:

assertThat(person.getAge())
  .as("%s's age should be equal to 100", person.getName())
  .isEqualTo(100);

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

[Alex's age should be equal to 100] expected:<100> but was:<34>

6. Java 8

AssertJ udnytter Java 8's funktionelle programmeringsfunktioner fuldt ud. 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å racet Hobbitten, og i Java 8 kan vi gøre noget som dette:

assertThat(fellowshipOfTheRing)
  .filteredOn(character -> character.getRace().equals(HOBBIT))
  .containsOnly(sam, frodo, pippin, merry);

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

7. Konklusion

I denne artikel undersøgte vi kort de muligheder, AssertJ giver os sammen med de mest populære påstande for kerne Java-typer.

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

Næste » AssertJ for Guava
Java tag