Razlika između metoda kada () i doXxx () u Mockitu

1. Uvod

Mockito je popularni Java podsmješni okvir. Pomoću njega jednostavno je stvoriti lažne objekte, konfigurirati lažno ponašanje, uhvatiti argumente metode i provjeriti interakciju s lažnim imenima.

Sada ćemo se usredotočiti na specificiranje lažnog ponašanja. Imamo dva načina za to: kada (). thenDoSomething () i doSomething (). when () sintaksa.

U ovom kratkom vodiču vidjet ćemo zašto ih imamo oboje.

2. kada() Metoda

Razmotrimo sljedeće Zaposlenik sučelje:

sučelje Zaposlenik {String greet (); void work (DayOfWeek dan); }

U našim testovima koristimo lažni prikaz ovog sučelja. Recimo da želimo konfigurirati lažne pozdraviti() metoda za vraćanje niza "Zdravo". To je jednostavno učiniti koristeći Mockito kada() metoda:

@Test void givenNonVoidMethod_callingWhen_shouldConfigureBehavior () {// dato kada (worker.greet ()). ThenReturn ("Hello"); // kada String pozdrav = zaposlenik.greet (); // zatim assertThat (pozdrav, je ("Zdravo")); }

Što se događa? The zaposlenik objekt je ismijavanje. Kada pozovemo bilo koju od njegovih metoda, Mockito registrira taj poziv. Uz poziv kada() metodom, Mockito zna da ovaj poziv nije bio interakcija poslovne logike. Bila je to izjava da želimo dodijeliti neko ponašanje lažnom objektu. Nakon toga, s jednim od tadaXxx () metodama, specificiramo očekivano ponašanje.

Do ovog trenutka dobro je staro ruganje. Isto tako, želimo konfigurirati raditi() metoda za izbacivanje iznimke, kada je zovemo argumentom od nedjelje:

@Test void givenVoidMethod_callingWhen_wontCompile () {// dato kada (worker.work (DayOfWeek.SUNDAY)). ThenThrow (new IAmOnHolidayException ()); // kada se izvršava workCall = () -> worker.work (DayOfWeek.SUNDAY); // zatim assertThrows (IAmOnHolidayException.class, workCall); }

Nažalost, ovaj se kod neće kompajlirati jer se u posao (zaposlenik.rad (...)) nazovite, raditi() metoda ima a poništiti povratni tip; stoga ga ne možemo umotati u drugi poziv metode. Znači li to da se ne možemo rugati praznim metodama? Naravno da možemo. doXxx metode za spašavanje!

3. doXxx () Metode

Pogledajmo kako možemo konfigurirati izbacivanje izuzetaka s doThrow () metoda:

@Test void givenVoidMethod_callingDoThrow_shouldConfigureBehavior () {// dato doThrow (novo IAmOnHolidayException ()). When (zaposlenik) .work (DayOfWeek.SUNDAY); // kada se izvršava workCall = () -> worker.work (DayOfWeek.SUNDAY); // zatim assertThrows (IAmOnHolidayException.class, workCall); }

Ova se sintaksa malo razlikuje od prethodne: ne pokušavamo zamotati a poništiti poziv metode unutar drugog poziva metode. Stoga se ovaj kod kompajlira.

Da vidimo što se upravo dogodilo. Prvo smo izjavili da želimo izuzeti. Dalje smo nazvali kada() metodom i proslijedili smo lažni objekt. Nakon toga odredili smo koje lažno ponašanje želimo konfigurirati.

Imajte na umu da ovo nije isto kada() metoda koju smo prije koristili. Također imajte na umu da smo lažnu interakciju povezali nakon pozivanja kada(). U međuvremenu smo je definirali unutar zagrade s prvom sintaksom.

Zašto imamo prvu kada (). tadaXxx (), kada nije sposoban za takav uobičajeni zadatak, kao što je konfiguriranje a poništiti prizivanje? Ima višestruke prednosti doXxx (). kada () sintaksa.

Prvi, logičnije je da programeri pišu i čitaju izjave poput "kad neka interakcija, onda učini nešto", nego "učini nešto, kad dođe do neke interakcije".

Drugo, možemo dodati više ponašanja istoj interakciji s lancem. To je zato što kada() vraća instancu klase U tokuStubing, što je tadaXxx () metode vraćaju isti tip.

S druge strane, doXxx () metode vraćaju a Stubber instance i Stubber.when (T mock) vraća se T, tako da možemo odrediti kakvu vrstu poziva želimo konfigurirati. Ali T dio je naše aplikacije, na primjer, Zaposlenik u našim isječcima koda. Ali T neće vratiti Mockito klasu, pa nećemo moći dodati višestruko ponašanje ulančavanjem.

4. BDDMockito

BDDMockito koristi alternativnu sintaksu onima koje smo obradili. Prilično je jednostavno: u našim lažnim konfiguracijama moramo zamijeniti ključnu riječ „kada" do "dato"I ključna riječ"čini"Do"htjeti“. Osim toga, naš kod ostaje isti:

@Test void givenNonVoidMethod_callingGiven_shouldConfigureBehavior () {// dato dato (worker.greet ()). WillReturn ("Hello"); // kada String pozdrav = zaposlenik.greet (); // zatim assertThat (pozdrav, je ("Zdravo")); } @Test void givenVoidMethod_callingWillThrow_shouldConfigureBehavior () {// dato willThrow (novo IAmOnHolidayException ()). Dato (zaposlenik) .work (DayOfWeek.SUNDAY); // kada je izvršni workCall = () -> zaposlenik.rad (DayOfWeek.SUNDAY); // zatim assertThrows (IAmOnHolidayException.class, workCall); }

5. Zaključak

Vidjeli smo prednosti i nedostatke konfiguriranja lažnog objekta kada (). tadaXxx () ili doXxx (). kada () put. Također, vidjeli smo kako funkcioniraju te sintakse i zašto imamo oboje.

Kao i obično, primjeri su dostupni na GitHubu.


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