Rozdiel medzi metódami when () a doXxx () v aplikácii Mockito

1. Úvod

Mockito je populárny výsmechový rámec Java. Vďaka tomu je jednoduché vytvárať falošné objekty, konfigurovať falošné správanie, zachytávať argumenty metód a overovať interakcie s falošnými správami.

Teraz sa zameriame na špecifikáciu falošného správania. Máme na to dva spôsoby: when (). thenDoSomething () a doSomething (). when () syntax.

V tomto krátkom návode sa dozvieme, prečo ich máme obidve.

2. kedy() Metóda

Zvážme nasledujúce Zamestnanec rozhranie:

rozhranie Zamestnanec {String greet (); neplatná práca (DayOfWeek day); }

V našich testoch používame simuláciu tohto rozhrania. Povedzme, že chceme nakonfigurovať falošné pozdraviť () metóda na vrátenie reťazca "Ahoj". Je to jednoduché urobiť pomocou Mockita kedy() metóda:

@Test void givenNonVoidMethod_callingWhen_shouldConfigureBehavior () {// zadaný kedy (employee.greet ()). ThenReturn ("Hello"); // keď String pozdrav = employee.greet (); // potom assertThat (pozdrav, je ("ahoj")); }

Čo sa stane? The zamestnanec objekt je falošný. Keď zavoláme niektorú z jej metód, Mockito zaregistruje toto volanie. S výzvou kedy() Mockito vie, že toto vyvolanie nebolo interakciou obchodnej logiky. Bolo to vyhlásenie, že chceme falošnému objektu priradiť určité správanie. Potom, s jedným z thenXxx () metód, určujeme očakávané správanie.

Do tohto bodu je to staré dobré posmievanie sa. Rovnako chceme nakonfigurovať práca() metóda na vyvolanie výnimky, keď ju zavoláme argumentom Sunday:

@Test void givenVoidMethod_callingWhen_wontCompile () {// zadané kedy (employee.work (DayOfWeek.SUNDAY)). ThenThrow (new IAmOnHolidayException ()); // keď Executable workCall = () -> employee.work (DayOfWeek.SUNDAY); // potom assertThrows (IAmOnHolidayException.class, workCall); }

Tento kód sa bohužiaľ nebude kompilovať, pretože v priečinku práca (zamestnanec. práca (…)) hovor, práca() metóda má a neplatný návratový typ; preto to nemôžeme zabaliť do iného volania metódy. Znamená to, že sa nemôžeme vysmievať neplatným metódam? Samozrejme, že môžeme. doXxx metódy na záchranu!

3. doXxx () Metódy

Pozrime sa, ako môžeme nakonfigurovať vyhadzovanie výnimiek pomocou doThrow () metóda:

@Test void givenVoidMethod_callingDoThrow_shouldConfigureBehavior () {// daný doThrow (nový IAmOnHolidayException ()). Keď (zamestnanec) .work (DayOfWeek.SUNDAY); // keď Executable workCall = () -> employee.work (DayOfWeek.SUNDAY); // potom assertThrows (IAmOnHolidayException.class, workCall); }

Táto syntax sa mierne líši od predchádzajúcej: neskúšame zabaliť a neplatný volanie metódy vnútri iného volania metódy. Preto sa tento kód kompiluje.

Pozrime sa, čo sa práve stalo. Najskôr sme uviedli, že chceme urobiť výnimku. Ďalej sme volali kedy() metódou a minuli sme falošný objekt. Potom sme určili, ktoré simulované správanie interakcie chceme nakonfigurovať.

Upozorňujeme, že to nie je to isté kedy() metóda, ktorú sme používali predtým. Upozorňujeme tiež, že falošnú interakciu sme pripútali po vyvolaní kedy(). Medzitým sme to definovali v zátvorke s prvou syntaxou.

Prečo máme prvé when (). thenXxx (), keď nie je schopný takej bežnej úlohy, ako je konfigurácia a neplatný vzývanie? Má niekoľko výhod pre doXxx (). when () syntax.

Najprv, pre vývojárov je logickejšie písať a čítať výroky ako „keď nejaká interakcia, tak niečo urob“ “ako„ niečo urob, keď nejaká interakcia “.

Po druhé, môžeme pridať k jednej interakcii s reťazením viac chovaní. To je preto, lebo kedy() vráti inštanciu triedy Prebieha pichanie, čo je thenXxx () metódy vracajú rovnaký typ.

Na druhej strane, doXxx () metódy vrátia a Stubber inštancie a Stubber.when (T mock) vracia T, takže môžeme určiť, aký druh vyvolania metódy chceme nakonfigurovať. ale T je súčasťou našej aplikácie, napríklad Zamestnanec v našich úryvkoch kódu. ale T nevráti triedu Mockito, takže nebudeme môcť pridať viac správania pomocou reťazenia.

4. BDDMockito

BDDMockito používa alternatívnu syntax k tým, ktoré sme pokryli. Je to celkom jednoduché: v našich simulovaných konfiguráciách musíme nahradiť kľúčové slovo „kedy"daný“A kľúčové slovo„robiť“Až„bude„. Okrem toho náš kód zostáva rovnaký:

@Test void givenNonVoidMethod_callingGiven_shouldConfigureBehavior () {// daný daný (employee.greet ()). WillReturn ("Hello"); // keď String pozdrav = employee.greet (); // potom assertThat (pozdrav, je ("ahoj")); } @Test void givenVoidMethod_callingWillThrow_shouldConfigureBehavior () {// daný willThrow (nový IAmOnHolidayException ()). Daný (zamestnanec) .work (DayOfWeek.SUNDAY); // keď Executable workCall = () -> employee.work (DayOfWeek.SUNDAY); // potom assertThrows (IAmOnHolidayException.class, workCall); }

5. Záver

Videli sme výhody a nevýhody konfigurácie falošného objektu when (). thenXxx () alebo doXxx (). when () spôsobom. Tiež sme videli, ako tieto syntaxe fungujú a prečo máme obe.

Ako obvykle sú príklady k dispozícii na GitHub.


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