Hurtigguide til BDDMockito

1. Oversikt

BDD-begrepet ble laget først av Dan North - tilbake i 2006.

BDD oppfordrer til å skrive tester på et naturlig, lesbart språk som fokuserer på oppførselen til applikasjonen.

Den definerer en tydelig strukturert måte å skrive tester på etter tre seksjoner (Arranger, Act, Assert):

  • gitt noen forutsetninger (Ordne)
  • når en handling skjer (lov)
  • deretter verifiser utdataene (Assert)

Mockito-biblioteket leveres med en BDDMockito klasse som introduserer BDD-vennlige APIer. Denne API-en gjør det mulig for oss å ta en mer BDD-vennlig tilnærming til å arrangere testene våre ved hjelp av gitt () og komme med påstander ved hjelp av deretter().

I denne artikkelen skal vi forklare hvordan vi setter opp våre BDD-baserte Mockito-tester. Vi vil også snakke om forskjeller mellom Mockito og BDDMockito APIer, for til slutt å fokusere på BDDMockito API.

2. Oppsett

2.1. Maven avhengigheter

BDD-smaken av Mockito er en del av mockito-kjerne bibliotek, for å komme i gang trenger vi bare å ta med artefakten:

 org.mockito mockito-core 2.21.0 

For den siste versjonen av Mockito, vennligst sjekk Maven Central.

2.2. Import

Testene våre kan bli mer lesbare hvis vi inkluderer følgende statiske import:

importer statisk org.mockito.BDDMockito. *;

Legg merke til det BDDMockito strekker Mockito, så vi vil ikke gå glipp av noen funksjoner som tilbys av den tradisjonelle Mockito API.

3. Mockito vs. BDDMockito

Den tradisjonelle håningen i Mockito utføres ved hjelp av når (obj).deretter*() i Arranger-trinnet.

Senere kan interaksjon med mocken vår valideres ved hjelp av bekrefte() i Assert-trinnet.

BDDMockito gir BDD-aliaser for forskjellige Mockito metoder, slik at vi kan skrive ordne trinnet vårt ved hjelp av gitt (i stedet for når), på samme måte kan vi skrive Assert-trinnet vårt ved hjelp av deretter (i stedet for bekrefte).

La oss se på et eksempel på et testorgan som bruker tradisjonell Mockito:

når (phoneBookRepository.contains (momContactName)) .thenReturn (false); phoneBookService.register (momContactName, momPhoneNumber); verifiser (phoneBookRepository) .insert (momContactName, momPhoneNumber);

La oss se hvordan det sammenlignes med BDDMockito:

gitt (phoneBookRepository.contains (momContactName)) .willReturn (false); phoneBookService.register (momContactName, momPhoneNumber); deretter (phoneBookRepository) .should () .insert (momContactName, momPhoneNumber);

4. Hånende med BDDMockito

La oss prøve å teste PhoneBookService hvor vi må spotte Telefonbok

offentlig klasse PhoneBookService {private PhoneBookRepository phoneBookRepository; public void register (String name, String phone) {if (! name.isEmpty () &&! phone.isEmpty () &&! phoneBookRepository.contains (name)) {phoneBookRepository.insert (name, phone); }} offentlig strengesøk (strengnavn) {if (! name.isEmpty () && phoneBookRepository.contains (name)) {return phoneBookRepository.getPhoneNumberByContactName (name); } returner null; }}

BDDMockito som Mockito tillater oss å returnere en verdi som kan være fast eller dynamisk. Det vil også tillate oss å kaste et unntak:

4.1. Returnerer en fast verdi

Ved hjelp av BDDMockito, Vi kunne enkelt konfigurere Mockito til å returnere et fast resultat når vår metode for mock-objektmål blir påkalt:

gitt (phoneBookRepository.contains (momContactName)) .willReturn (false); phoneBookService.register (xContactName, ""); deretter (phoneBookRepository) .should (never ()) .insert (momContactName, momPhoneNumber);

4.2. Returnerer en dynamisk verdi

BDDMockito lar oss gi en mer sofistikert måte å returnere verdier på. Vi kan returnere et dynamisk resultat basert på innspillene:

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

4.3. Kaster et unntak

Å si Mockito om å kaste et unntak er ganske grei:

gitt (phoneBookRepository.contains (xContactName)) .willReturn (false); willThrow (ny RuntimeException ()). gitt (telefonBookRepository) .innsetting (hvilken som helst (String.class), eq (tooLongPhoneNumber)); prøv {phoneBookService.register (xContactName, tooLongPhoneNumber); fail ("Bør kaste unntak"); } catch (RuntimeException ex) {} then (phoneBookRepository) .should (never ()) .insert (momContactName, tooLongPhoneNumber);

Legg merke til hvordan vi byttet stillingene til gitt og vil*, det er obligatorisk i tilfelle vi spotter en metode som ikke har noen returverdi.

Legg også merke til at vi brukte argumentmatchere som (noen, ekv) for å gi en mer generisk måte å spotte basert på kriterier snarere enn avhengig av en fast verdi.

5. Konklusjon

I denne raske opplæringen diskuterte vi hvordan BDDMockito prøver å få en BDD-likhet med våre Mockito-tester, og vi diskuterte noen av forskjellene mellom Mockito og BDDMockito.

Som alltid kan kildekoden bli funnet på GitHub - i testpakken com.baeldung.bddmockito.


$config[zx-auto] not found$config[zx-overlay] not found