Uvod u AssertJ

Ovaj je članak dio niza: • Uvod u AssertJ (trenutni članak) • AssertJ za Guavu

• AssertJ-ove značajke Java 8

• Prilagođene tvrdnje s AssertJ-om

1. Pregled

U ovom ćemo članku istraživati ​​AssertJ - biblioteku koju pokreće zajednica koja se koristi za pisanje tečnih i bogatih tvrdnji u Java testovima.

Ovaj se članak usredotočuje na alate dostupne u osnovnom modulu AssertJ pod nazivom AssertJ-jezgra.

2. Ovisnosti Mavena

Da biste koristili AssertJ, morate u svoj sljedeći odjeljak uključiti sljedeći odjeljak pom.xml datoteka:

 org.assertj assertj-core 3.4.1 test 

Ova ovisnost pokriva samo osnovne Java tvrdnje. Ako želite koristiti napredne tvrdnje, morat ćete zasebno dodati dodatne module.

Imajte na umu da biste za Javu 7 i starije trebali koristiti jezgro AssertJ verzije 2.x.x.

Najnovije verzije možete pronaći ovdje.

3. Uvod

AssertJ nudi skup klasa i korisnih metoda koje nam omogućuju da lako napišemo tečne i lijepe tvrdnje za:

  • Standardna Java
  • Java 8
  • Guava
  • Joda Vrijeme
  • Neo4J i
  • Swing komponente

Detaljan popis svih modula dostupan je na web stranici projekta.

Počnimo s nekoliko primjera, izravno iz dokumentacije AssertJ-a:

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

Gornji primjeri samo su vrh sante leda, ali dajte nam pregled kako bi moglo izgledati pisanje tvrdnji s ovom knjižnicom.

4. AssertJ na djelu

U ovom ćemo se dijelu usredotočiti na postavljanje AssertJ-a i istraživanje njegovih mogućnosti.

4.1. Početak rada

S jarkom biblioteke na putu predavanja, omogućavanje tvrdnji jednostavno je kao dodavanje pojedinačnog statičkog uvoza u testnu klasu:

uvezi statički org.assertj.core.api.Assertions. *;

4.2. Pisanje tvrdnji

Da biste napisali tvrdnju, uvijek morate započeti s prosljeđivanjem svog objekta na Tvrdnje.assertThat () metodu, a zatim slijedite stvarne tvrdnje.

Važno je zapamtiti da za razliku od nekih drugih knjižnica, donji kod zapravo još ništa ne tvrdi i hoće nikada pasti na testu:

assertThat (anyRefenceOrValue);

Ako iskoristite značajke za dovršavanje koda vašeg IDE-a, pisanje tvrdnji AssertJ postaje nevjerojatno jednostavno zbog svojih vrlo opisnih metoda. Evo kako to izgleda u IntelliJ IDEA 16:

IDE značajke dovršenja koda

Kao što vidite, na raspolaganju imate desetke kontekstualnih metoda, a one su dostupne samo za njih Niz tip. Istražimo detaljno neke od ovog API-ja i pogledajmo neke konkretne tvrdnje.

4.3. Objekt Tvrdnje

Predmeti mogu se usporediti na razne načine ili za utvrđivanje jednakosti dvaju predmeta ili za ispitivanje polja predmeta.

Pogledajmo dva načina na koje možemo usporediti jednakost dvaju predmeta. S obzirom na sljedeće dvije Pas predmeta fido i fidosClone:

pas javne klase {naziv privatnog niza; privatna težina plovka; // standardni geteri i postavljači} Pas fido = novi pas ("Fido", 5.25); Pas fidosClone = novi pas ("Fido", 5.25);

Jednakost možemo usporediti sa sljedećom tvrdnjom:

assertThat (fido) .isEqualTo (fidosClone);

Ovo neće uspjeti kao jednako je() uspoređuje reference objekata. Ako umjesto toga želimo usporediti njihov sadržaj, možemo koristiti isEqualToComparingFieldByFieldRecursively () ovako:

assertThat (fido) .isEqualToComparingFieldByFieldRecursively (fidosClone);

Fido i fidosClone su jednaki kada se vrši rekurzivno polje po usporedba polja, jer se svako polje jednog objekta uspoređuje s poljem drugog objekta.

Postoje mnoge druge metode tvrdnji koje pružaju različite načine za usporedbu i ugovaranje objekata te za ispitivanje i utvrđivanje na njihovim poljima. Da biste ih sve otkrili, obratite se službenoj osobi AbstractObjectAssert dokumentacija.

4.4. Booleova Tvrdnje

Postoje nekoliko jednostavnih metoda za ispitivanje istine:

  • je istina()
  • isFalse ()

Pogledajmo ih na djelu:

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

4.5. Iterable / Array Tvrdnje

Za Iterativ ili an Polje postoji više načina da se utvrdi da njihov sadržaj postoji. Jedna od najčešćih tvrdnji bila bi provjera je li Iterativ ili Polje sadrži zadani element:

Popis popisa = Arrays.asList ("1", "2", "3"); assertThat (list) .contains ("1");

ili ako a Popis nije prazno:

assertThat (list) .isNotEmpty ();

ili ako a Popis započinje zadanim likom. Na primjer "1":

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

Imajte na umu da ako želite stvoriti više tvrdnji za isti objekt, možete ih lako pridružiti.

Evo primjera tvrdnje koja provjerava je li navedeni popis prazan, sadrži element "1", ne sadrži nule i sadrži li niz elemenata "2", "3":

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

Naravno da postoji mnogo više mogućih tvrdnji za te vrste. Da biste ih sve otkrili, obratite se službenoj osobi AbstractIterableAssert dokumentacija.

4.6. Lik Tvrdnje

Tvrdnje za tipove znakova uglavnom uključuju usporedbe, pa čak i provjeru je li dati znak iz a Unicode stol.

Evo primjera tvrdnje koja provjerava da li navedeni znak nije 'a', nalazi li se u tablici Unicode, veći je od 'b' i je li malim slovom:

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

Detaljan popis tvrdnji svih tipova znakova potražite u AbstractCharacterAssert dokumentacija.

4.7. Razred Tvrdnje

Tvrdnje za Razred tipa uglavnom o provjeri njegovih polja, Razred vrste, prisutnost bilješki i konačnost razreda.

Ako želite potvrditi tu klasu Izvodljivo je sučelje, trebate jednostavno napisati:

assertThat (Runnable.class) .isInterface ();

ili ako želite provjeriti može li se jedan razred dodijeliti drugom:

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

Sve moguće Razred tvrdnje se mogu vidjeti u AbstractClassAssert dokumentacija.

4.8. Datoteka Tvrdnje

Datoteka tvrdnje se tiču ​​provjere je li zadana Datoteka instanca postoji, je direktorij ili datoteka, ima određeni sadržaj, čitljiv je ili je dao ekstenziju.

Ovdje možete vidjeti primjer tvrdnje koja provjerava postoji li određena datoteka, je li datoteka, a ne direktorij, može li se čitati i zapisati:

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

Sve moguće tvrdnje o klasi mogu se pogledati u AbstractFileAssert dokumentacija.

4.9. Double / Float / Integer Tvrdnje

Double / Float / Integer i druge Broj Vrste

Numeričke tvrdnje odnose se na usporedbu numeričkih vrijednosti unutar ili bez zadanog pomaka. Na primjer, ako želite provjeriti jesu li dvije vrijednosti jednake prema zadanoj preciznosti, možemo učiniti sljedeće:

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

Primijetite da koristimo već uvezene withPrecision (dvostruki pomak) pomoćna metoda za generiranje Pomak predmeta.

Dodatne tvrdnje potražite u dokumentaciji AbstractDoubleAssert.

4.10. InputStream Tvrdnje

Postoji samo jedan InputStream-specifična tvrdnja dostupna:

  • hasSameContentAs (očekuje se InputStream)

i u akciji:

assertThat (dano) .hasSameContentAs (očekuje se);

4.11. Karta Tvrdnje

Karta tvrdnje omogućuju provjeru sadrži li karta određeni unos, skup unosa ili ključeve / vrijednosti zasebno.

I ovdje možete vidjeti primjer tvrdnje koja provjerava je li zadana karta prazna, sadrži brojčani ključ "2", ne sadrži numerički ključ "10" i sadrži li unos: ključ: 2, vrijednost: "a":

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

Za više tvrdnji vidi AbstractMapAssert dokumentacija.

4.12. Bacljivo Tvrdnje

Bacljivo tvrdnje omogućuju na primjer: pregledavanje poruka iznimke, stacktraceova, provjeru uzroka ili provjeru je li iznimka već bačena.

Pogledajmo primjer tvrdnje koja provjerava je li zadana iznimka bačena i ima li poruku koja završava s "c":

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

Za više tvrdnji pogledajte dokumentaciju AbstractThrowableAssert.

5. Opisivanje tvrdnji

Da biste postigli još veću razinu detaljnosti, možete stvoriti dinamički generirane prilagođene opise za svoje tvrdnje. Ključ za to je kao (Opis niza, objekt ... argumenti) metoda.

Ako svoju tvrdnju definirate ovako:

assertThat (person.getAge ()) .as ("starost% s trebala bi biti jednaka 100", person.getName ()) .isEqualTo (100);

ovo ćete dobiti prilikom izvođenja testova:

[Alexova dob trebala bi biti jednaka 100] očekivano: ali bilo je:

6. Java 8

AssertJ u potpunosti koristi funkcije funkcionalnog programiranja Java 8. Zaronimo u primjer i uvidimo ga u akciji. Prvo da vidimo kako to radimo u Javi 7:

assertThat (ellowshipOfTheRing) .filteredOn ("utrka", HOBBIT) .contentOnly (sam, frodo, pippin, veseo);

Ovdje filtriramo kolekciju na utrci Hobbit, a u Javi 8 možemo učiniti nešto poput ovoga:

assertThat (ellowshipOfTheRing) .filteredOn (character -> character.getRace (). jednako (HOBBIT)) .containsOnly (sam, frodo, pippin, veseo);

Istražit ćemo AssertJ-ove mogućnosti Java8 u budućem članku iz ove serije. Gornji primjeri preuzeti su s web mjesta AssertJ.

7. Zaključak

U ovom smo članku ukratko istražili mogućnosti koje nam pruža AssertJ zajedno s najpopularnijim tvrdnjama za osnovne Java tipove.

Implementacija svih primjera i isječaka koda mogu se naći u projektu GitHub.

Sljedeći » AssertJ za Guavu