Kratki vodič za BDDMockito

1. Pregled

Izraz BDD prvi je skovao Dan North - još 2006. godine.

BDD potiče pisanje testova na prirodnom, čovjeku čitljivom jeziku koji je usredotočen na ponašanje aplikacije.

Definira jasno strukturiran način pisanja testova u sljedeća tri odjeljka (Arrange, Act, Assert):

  • dato neki preduvjeti (dogovoriti)
  • kada dogodi se radnja (djelovati)
  • zatim provjeriti izlaz (potvrditi)

Biblioteka Mockito isporučuje se s BDDMockito klasa koja uvodi API-je pogodne za BDD. Ovaj API omogućuje nam pristup prilagođavanju BDD-u pri dogovaranju naših testova dao () i iznošenje tvrdnji pomoću zatim().

U ovom ćemo članku objasniti kako postaviti naše Mockito testove zasnovane na BDD-u. Također ćemo razgovarati o razlikama između Mockito i BDDMockito API-ji, da bi se na kraju usredotočili na BDDMockito API.

2. Postavljanje

2.1. Ovisnosti Mavena

BDD okus Mockita dio je mockito-core knjižnica, da bismo započeli potrebno je samo uključiti artefakt:

 org.mockito mockito-core 2.21.0 

Za najnoviju verziju Mockita provjerite Maven Central.

2.2. Uvoz

Naši testovi mogu postati čitljiviji ako uključimo sljedeći statički uvoz:

uvezi statički org.mockito.BDDMockito. *;

Primijeti da BDDMockito proteže se Mockito, tako da nećemo propustiti nijednu značajku koju pruža tradicionalni Mockito API.

3. Mockito protiv BDDMockito

Tradicionalno ruganje u Mockitu izvodi se pomoću kada (obj).zatim*() u koraku Rasporedi.

Kasnije se interakcija s našim mockom može provjeriti pomoću provjeri () u koraku Izvještaj.

BDDMockito pruža BDD pseudonime za razne Mockito metode, kako bismo mogli napisati naš korak Arrange koristeći dato (umjesto kada), također bismo svoj korak Assert mogli napisati pomoću zatim (umjesto provjeriti).

Pogledajmo primjer testnog tijela pomoću tradicionalnog Mockita:

kada (phoneBookRepository.contens (momContactName)). thenReturn (false); phoneBookService.register (momContactName, momPhoneNumber); provjeriti (phoneBookRepository) .insert (momContactName, momPhoneNumber);

Pogledajmo kako se to može usporediti BDDMockito:

dato (phoneBookRepository.contens (momContactName)) .willReturn (false); phoneBookService.register (momContactName, momPhoneNumber); zatim (phoneBookRepository) .should () .insert (momContactName, momPhoneNumber);

4. Ruganje sa BDDMockito

Pokušajmo testirati Telefonska usluga gdje ćemo se morati rugati Spremište telefonskog imenika:

javna klasa PhoneBookService {privatni PhoneBookRepository phoneBookRepository; javni void register (String name, String phone) {if (! name.isEmpty () &&! phone.isEmpty () &&! phoneBookRepository.contens (name)) {phoneBookRepository.insert (ime, telefon); }} javno pretraživanje niza (naziv niza) {if (! name.isEmpty () && phoneBookRepository.contains (name)) {return phoneBookRepository.getPhoneNumberByContactName (name); } return null; }}

BDDMockito kao Mockito omogućuje nam vraćanje vrijednosti koja može biti fiksna ili dinamička. Također bi nam omogućilo da izuzmemo iznimku:

4.1. Vraćanje fiksne vrijednosti

Koristeći BDDMockito, lako bismo mogli konfigurirati Mockito da vraća fiksni rezultat kad god se pozove naša metoda lažnog cilja:

dato (phoneBookRepository.contens (momContactName)) .willReturn (false); phoneBookService.register (xContactName, ""); zatim (phoneBookRepository) .should (never ()) .insert (momContactName, momPhoneNumber);

4.2. Vraćanje dinamičke vrijednosti

BDDMockito omogućuje nam pružanje sofisticiranijeg načina vraćanja vrijednosti. Na temelju unosa mogli bismo vratiti dinamički rezultat:

dano (phoneBookRepository.contens (momContactName)) .willReturn (true); dano (phoneBookRepository.getPhoneNumberByContactName (momContactName)) .will ((InvocationOnMock invocation) -> invocation.getArgument (0) .equals (momContactName)? momPhoneNumber: null); phoneBookService.search (momContactName); zatim (phoneBookRepository) .should () .getPhoneNumberByContactName (momContactName); 

4.3. Bacanje iznimke

Reći Mockitu da izbaci iznimku prilično je jednostavno:

dato (phoneBookRepository.contens (xContactName)) .willReturn (false); willThrow (novi RuntimeException ()). Given (phoneBookRepository) .insert (bilo koji (String.class), eq (tooLongPhoneNumber)); isprobajte {phoneBookService.register (xContactName, tooLongPhoneNumber); fail ("Treba izbaciti iznimku"); } catch (RuntimeException ex) {} zatim (phoneBookRepository) .should (never ()) .insert (momContactName, tooLongPhoneNumber);

Primijetite kako smo razmijenili stavove dato i htjeti*, to je obavezno u slučaju da se rugamo metodi koja nema povratnu vrijednost.

Također primijetite da smo koristili podudaranje argumenata poput (bilo koji, ekv) kako bi se pružio generičkiji način ismijavanja na temelju kriterija, a ne na temelju fiksne vrijednosti.

5. Zaključak

U ovom smo brzom vodiču razgovarali o tome kako BDDMockito pokušava navesti BDD sličnost s našim Mockito testovima i razgovarali smo o nekim razlikama između Mockito i BDDMockito.

Kao i uvijek, izvorni kod možete pronaći na GitHub-u - unutar test paketa com.baeldung.bddmockito.