JMockit 101

1. Uvod

Ovim ćemo člankom započeti novu seriju usredotočenu na podrugljivi alat JMockit.

U ovom prvom dijelu razgovarat ćemo o tome što je JMockit, njegovim karakteristikama i kako se s njim stvaraju i koriste makete.

Kasniji članci usredotočit će se i ući dublje u njegove mogućnosti.

2. JMockit

2.1. Uvod

Prije svega, razgovarajmo o tome što je JMockit: Java okvir za ruganje objektima u testovima (možete ga koristiti i za JUnit i za TestNG).

Koristi Java-ove API-je za instrumentaciju za modificiranje byte-koda klasa tijekom izvođenja kako bi dinamički promijenio njihovo ponašanje. Neke od njegovih jakih strana su izrazitost i izvanmrežna sposobnost ruganja statičkim i privatnim metodama.

Možda ste novi u JMockitu, ali definitivno nije zbog toga što je nov. Razvoj JMockita započeo je u lipnju 2006., a njegovo prvo stabilno izdanje datira na prosinac 2012., tako da postoji već neko vrijeme (trenutna verzija je 1.24 u trenutku pisanja članka).

2.2. Ovisnost Mavena

Prvo ćemo trebati dodati jmockit ovisnost u naš projekt:

 org.jmockit jmockit 1,41 

2.3. Izrazivost JMockita

Kao što je već rečeno, jedna od najjačih točaka JMockita je njegova izrazljivost. Da biste stvorili podsmjehe i definirali njihovo ponašanje, umjesto pozivanja metoda iz API-ja za ruganje, samo ih trebate izravno definirati.

To znači da nećete raditi sljedeće:

API.expect (mockInstance.method ()). AndThenReturn (value) .times (2);

Umjesto toga, očekujte stvari poput:

novo očekivanje () {mockInstance.method (); rezultat = vrijednost; puta = 2; }

Možda se čini da je to više koda, ali jednostavno možete staviti sve tri retke samo na jedan. Stvarno je važan dio da ne završite s velikim "vlakom" lančanih poziva metode. Umjesto toga, na kraju ćete dobiti definiciju kako želite da se lažni ponaša kad je pozvan.

Ako uzmete u obzir da je na rezultat = vrijednost Možete vratiti bilo što (fiksne vrijednosti, dinamički generirane vrijednosti, iznimke itd.), izražajnost JMockita postaje još očitija.

2.4. Model za snimanje, ponovnu reprodukciju i provjeru

Testovi koji koriste JMockit podijeljeni su u tri različite faze: snimanje, ponovna reprodukcija i provjera.

  1. Na snimiti fazu, tijekom pripreme testa i prije pozivanja na metode koje želimo izvršiti, definirat ćemo očekivano ponašanje svih testova koji će se koristiti tijekom sljedeće faze.
  2. The ponoviti faza je ona u kojoj se izvršava testni kod. Pozivi ismijanih metoda / konstruktora prethodno snimljeni u prethodnoj fazi sada će se ponoviti.
  3. Napokon, na provjeriti fazi, ustvrdit ćemo da je rezultat testa bio onaj koji smo očekivali (i da su se lažni ponašali i koristili u skladu s onim što je definirano u fazi snimanja).

S primjerom koda, žičani okvir za test izgledao bi otprilike ovako:

@Test public void testWireframe () {// kod pripreme koji nije specifičan za JMockit, ako postoje nova očekivanja () {{// definiranje očekivanog ponašanja za lažne slike}}; // izvrši testiranje novog koda Verifications () {{// verify mocks}}; // tvrdnje}

3. Stvaranje ismijavanja

3.1. JMockitove bilješke

Kada upotrebljavate JMockit, najlakši način za upotrebu lažiranja je korištenje napomena. Tri su za stvaranje lažnih (@Mocked, @Injekcijski i @ Snimanje) i jedan za navođenje klase koja se testira (@ Testirano).

Kada koristite @Mocked napomena na polju, stvorit će ismijane instance svakog novog objekta te određene klase.

S druge strane, s @Injekcijski napomena, stvorit će se samo jedna izrugana instanca.

Posljednja napomena, @ Snimanje ponašat će se kao @Mocked, ali će proširiti svoj doseg na svaku potklasu koja proširuje ili implementira tip označenog polja.

3.2. Prosljeđivanje argumenata na testove

Kada se koristi JMockit, moguće je prosljeđivanje lažnih podataka kao testnih parametara. Ovo je vrlo korisno za stvaranje lažne slike samo za taj jedan test, poput nekog složenog modela modela koji treba određeno ponašanje samo za jedan test, na primjer. Bilo bi to otprilike ovako:

@RunWith (JMockit.class) javna klasa TestPassingArguments {@Injectable private Foo mockForEveryTest; @ Testirani privatni bar bar; @Test javni void testExample (@Mocked Xyz mockForJustThisTest) {nova očekivanja () {{mockForEveryTest.someMethod ("foo"); mockForJustThisTest.someOtherMethod (); }}; bar.codeUnderTest (); }}

Ovaj način stvaranja lažne slike prosljeđivanjem kao parametar, umjesto da moramo pozivati ​​neku API metodu, opet nam pokazuje ekspresibilnost o kojoj govorimo od početka.

3.3. Potpuni primjer

Za kraj ovog članka dat ćemo cjelovit primjer testa pomoću JMockita.

U ovom ćemo primjeru testirati a Izvođač razred koji koristi Suradnik u svojoj izvesti () metoda. Ovaj izvesti () metoda, prima a Model objekt kao parametar iz kojeg će koristiti svoj dobiti informacije() koji vraća String, ovaj će niz biti proslijeđen u surađivati ​​() metoda iz Suradnik to će se vratiti pravi za ovaj određeni test, a ta će vrijednost biti proslijeđena u primiti () metoda iz Suradnik.

Dakle, testirani razredi izgledat će ovako:

model javne klase {javni niz getInfo () {return "info"; }} public class Collaborator {public boolean suradnja (string string) {return false; } public void receive (boolean bool) {// NOOP}} izvođač javne klase {private Collaborator suradnik; javna void izvedba (model modela) {boolean value = saradnik.collaborate (model.getInfo ()); suradnik.primiti (vrijednost); }}

I kod testa na kraju će biti takav:

@RunWith (JMockit.class) performerTest javne klase {@Injectable private Collaborator suradnik; @ Testirani izvođač izvođača; @Test javni void testThePerformMethod (@Mocked Model model) {nova očekivanja () {{model.getInfo (); rezultat = "bar"; suradnik.collaborate ("bar"); rezultat = točno; }}; performer.perform (model); nove provjere () {{suradnik.receive (true); }}; }}

4. Zaključak

Ovim ćemo završiti naš praktični uvod u JMockit. Ako želite saznati više o JMockitu, pratite buduće članke.

Potpuna implementacija ovog vodiča može se naći na projektu GitHub.

4.1. Članci u seriji

Svi članci serije:

  • JMockit 101
  • Vodič za JMockit - očekivanja
  • Napredno korištenje JMockita

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