Az EasyMock bemutatása

1. Bemutatkozás

A múltban sokat beszéltünk JMockitról és Mockitóról.

Ebben az oktatóanyagban bemutatunk egy másik gúnyoló eszközt - az EasyMock-ot.

2. Maven-függőségek

Mielőtt belevetnénk magunkat, adjuk hozzá a következő függőséget pom.xml:

 org.easymock easymock 3.5.1 teszt 

A legfrissebb verzió mindig itt található.

3. Alapfogalmak

A gúny előállításakor szimulálhatjuk a célobjektumot, meghatározhatjuk annak viselkedését, és végül ellenőrizhetjük, hogy a várakozásoknak megfelelően használják-e.

Az EasyMock gúnyaival négy lépésből áll:

  1. megalkotva a célosztály gúnyát
  2. várható viselkedésének rögzítése, ideértve az akciót, az eredményt, a kivételeket stb.
  3. gúnyok felhasználása a tesztekben
  4. annak ellenőrzése, hogy a várt módon viselkedik-e

Miután a felvételünk befejeződött, átkapcsoljuk „visszajátszás” módra, hogy a gúny a rögzített módon viselkedjen, amikor bármilyen objektummal együttműködik, amely használni fogja.

Végül ellenőrizzük, hogy minden a vártnak megfelelően halad-e.

A fent említett négy lépés a org.easymock.EasyMock:

  1. gúny (…): generál egy megcélzást a célosztályból, legyen az konkrét osztály vagy interfész. A létrehozás után egy gúny „felvétel” módban van, ami azt jelenti, hogy az EasyMock rögzíti a gúnyobjektum által végrehajtott összes műveletet, és újrajátszja őket „visszajátszás” módban
  2. várható (…): ezzel a módszerrel megadhatjuk az elvárásokat, beleértve a hívásokat, eredményeket és kivételeket a kapcsolódó felvételi műveletekkel kapcsolatban
  3. visszajátszás(…): egy adott modellt „visszajátszás” módba kapcsol. Ezután a korábban rögzített metódushívásokat kiváltó műveletek visszajátszják a „rögzített eredményeket”
  4. igazolni (…): ellenőrzi, hogy minden elvárás teljesült-e, és hogy nem hajtottak-e végre váratlan hívást egy gúnyon

A következő szakaszban bemutatjuk, hogyan működnek ezek a lépések valós példák felhasználásával.

4. A gúnyolás gyakorlati példája

Mielőtt folytatnánk, vessünk egy pillantást a példakörnyezetre: mondjuk van egy olvasónk a Baeldung blogról, aki szeret böngészni a weboldalon található cikkeket, majd megpróbál cikkeket írni.

Kezdjük a következő modell létrehozásával:

public class BaeldungReader {private ArticleReader articleReader; privát IArticleWriter articleWriter; // konstruktorok nyilvános BaeldungArticle readNext () {return articleReader.next (); } public listTopic (String topic) {return articleReader.ofTopic (topic); } public String write (String title, String content) {return articleWriter.write (title, content); }}

Ebben a modellben két magántagunk van: a articleReader(konkrét osztály) és a articleWriter (egy interfész).

Ezután kigúnyoljuk őket, hogy ellenőrizzék BaeldungReaderViselkedése.

5. Gúny Java kóddal

Kezdjük egy gúnyolódással ArticleReader.

5.1. Tipikus gúnyolódás

Arra számítunk, hogy articleReader.next () akkor hívandó módszer, amikor az olvasó kihagy egy cikket:

@Test public void whenReadNext_thenNextArticleRead () {ArticleReader mockArticleReader = gúny (ArticleReader.class); BaeldungReader baeldungReader = új BaeldungReader (mockArticleReader); várható (mockArticleReader.next ()). ésReturn (null); visszajátszás (mockArticleReader); baeldungReader.readNext (); ellenőrizni (mockArticleReader); }

A fenti mintakódban szigorúan ragaszkodunk a 4 lépéses eljáráshoz, és megcsúfoljuk a ArticleReader osztály.

Bár nagyon nem érdekel mi mockArticleReader.next () visszatér, akkor is meg kell adnunk egy visszatérési értéket a mockArticleReader.next () használva várható (…) .és Visszatérés (…).

Val vel várni (…), Az EasyMock arra számít, hogy a módszer visszaad egy értéket vagy eldob egy Kivétel.

Ha egyszerűen megtesszük:

mockArticleReader.next (); visszajátszás (mockArticleReader);

Az EasyMock panaszkodni fog erre, mivel hívást igényel várható (…) .ésReturn (…) ha a módszer bármit visszaad.

Ha ez a üres módszerrel elvárják akcióját felhasználva várhatóLastCall () mint ez:

mockArticleReader.someVoidMethod (); várhatóLastCall (); visszajátszás (mockArticleReader);

5.2. Visszajátszási sorrend

Ha szükségünk van egy meghatározott sorrendben történő visszajátszásra, akkor szigorúbbak lehetünk:

@Test public void whenReadNextAndSkimTopics_thenAllAllowed () {ArticleReader mockArticleReader = strictMock (ArticleReader.class); BaeldungReade baeldungReader = új BaeldungReader (mockArticleReader); várható (mockArticleReader.next ()). ésReturn (null); várható (mockArticleReader.ofTopic ("easymock")). ésReturn (null); visszajátszás (mockArticleReader); baeldungReader.readNext (); baeldungReader.readTopic ("easymock"); ellenőrizni (mockArticleReader); }

Ebben a részletben mi használat strictMock (…) hogy ellenőrizze a módszerhívások sorrendjét. Által létrehozott gúnyokra gúny (…) és strictMock (…), minden váratlan metódushívás AssertionError.

Bármelyik metódushívás engedélyezéséhez használhatjuk niceMock (…):

@Test public void whenReadNextAndOthers_thenAllowed () {ArticleReader mockArticleReader = niceMock (ArticleReader.class); BaeldungReade baeldungReader = új BaeldungReader (mockArticleReader); várható (mockArticleReader.next ()). ésReturn (null); visszajátszás (mockArticleReader); baeldungReader.readNext (); baeldungReader.readTopic ("easymock"); ellenőrizni (mockArticleReader); }

Itt nem számítottunk a baeldungReader.readTopic (…) hívni, de az EasyMock nem fog panaszkodni. Val vel niceMock (…), Az EasyMock most már csak azt érdekli, hogy a célobjektum várt műveletet hajtott-e végre, vagy sem.

5.3. Gúnyolódni Kivétel Dobások

Most folytassuk az interfész gúnyolódását IArticleWriter, és hogyan kell kezelni a várható Dobók:

@Test public void whenWriteMaliciousContent_thenArgumentIllegal () {// gúnyolódás és inicializálás várható (mockArticleWriter .write ("easymock", ""))) .andThrow (új IllegalArgumentException ()); visszajátszás (mockArticleWriter); // rosszindulatú tartalom írása és kivétel kivétele a várakozásnak megfelelőenException verify (mockArticleWriter); assertEquals (IllegalArgumentException.class, várhatóException.getClass ()); }

A fenti részletben arra számítunk, hogy articleWriter elég szilárd az XSS (Cross-site Scripting) támadások észleléséhez.

Tehát, amikor az olvasó rosszindulatú kódot próbál beinjekciózni a cikk tartalmába, az írónak meg kell dobnia IllegalArgumentException. Ezt a várható viselkedést felhasználva rögzítettük várható (…) .andThrow (…).

6. Gúnyolódás kommentárral

Az EasyMock támogatja a gúnyok injekciózását is annotációk segítségével. Használatukhoz az egység tesztjeit kell futtatnunk EasyMockRunner hogy feldolgozza @Mock és @Tesztalany annotációk.

Írjuk át a korábbi részleteket:

@RunWith (EasyMockRunner.class) nyilvános osztály BaeldungReaderAnnotatedTest {@Mock ArticleReader mockArticleReader; @TestSubject BaeldungReader baeldungReader = új BaeldungReader (); @Test public void whenReadNext_thenNextArticleRead () {várható (mockArticleReader.next ()). AndReturn (null); visszajátszás (mockArticleReader); baeldungReader.readNext (); ellenőrizni (mockArticleReader); }}

Egyenértékű gúny (…), egy gúnyt injektálunk a (z) jelöléssel ellátott mezőkbe @Mock. Ezeket a gúnyokat az osztályba tartozó mezőkbe injektálják @Tesztalany.

A fenti részletben nem inicializáltuk a articleReader mező ben baeldungReader. Híváskor baeldungReader.readNext (), interakcióba léphetünk, amelyet implicit módon hívunk mockArticleReader.

Ez azért volt mockArticleReader beadták a cikkReader terület.

Vegye figyelembe, hogy ha egy másik tesztfutót akarunk használni a helyett EasyMockRunner, használhatjuk a JUnit tesztszabályt EasyMockRule:

public class BaeldungReaderAnnotatedWithRuleTest {@Rule public EasyMockRule mockRule = new EasyMockRule (this); // ... @Test public void whenReadNext_thenNextArticleRead () {várható (mockArticleReader.next ()). AndReturn (null); visszajátszás (mockArticleReader); baeldungReader.readNext (); ellenőrizni (mockArticleReader); }}

7. Gúnyolódni EasyMockSupport

Néha több próbát is be kell vezetnünk egyetlen teszt során, és manuálisan kell ismételnünk:

visszajátszás (A); ismétlés (B); visszajátszás (C); // ... igazolja (A); ellenőrizze (B); ellenőrizze (C);

Ez csúnya, és elegáns megoldásra van szükségünk.

Szerencsére van osztályunk EasyMockSupport az EasyMock alkalmazásban hogy segítsen ennek kezelésében. Azt segít nyomon követni a gúnyokat, így visszajátszhatjuk és ellenőrizhetjük őket egy ilyen tétel:

// ... public class BaeldungReaderMockSupportTest kiterjeszti az EasyMockSupport {// ... @Test public void whenReadAndWriteSequencially_thenWorks () {várható (mockArticleReader.next ()). andReturn (null) .times (2) .andThrow (new NoSuchElementEx ; várható (mockArticleWriter.write ("title", "content")) .andReturn ("BAEL-201801"); replayAll (); // olvasási és írási műveletek végrehajtása egymás után verAll (); assertEquals (NoSuchElementException.class, várhatóException.getClass ()); assertEquals ("BAEL-201801", cikkId); }}

Itt mindkettőt gúnyoltuk articleReader és articleWriter. Amikor ezeket az álokat „visszajátszás” módba állítottuk, statikus módszert használtunk replayAll () által biztosított EasyMockSupport, és használt verAll () hogy viselkedésüket tételesen ellenőrizzék.

Mi is bemutattuk idők (…) módszer a elvárják fázis. Segít meghatározni, hogy hányszor várjuk a módszer meghívását, hogy elkerüljük a duplikált kód bevezetését.

Használhatjuk is EasyMockSupport delegálás útján:

EasyMockSupport easyMockSupport = új EasyMockSupport (); @Test public void whenReadAndWriteSequencially_thenWorks () {ArticleReader mockArticleReader = easyMockSupport .createMock (ArticleReader.class); IArticleWriter mockArticleWriter = easyMockSupport .createMock (IArticleWriter.class); BaeldungReader baeldungReader = új BaeldungReader (mockArticleReader, mockArticleWriter); várható (mockArticleReader.next ()). ésReturn (null); várható (mockArticleWriter.write ("title", "content")) .andReturn (""); easyMockSupport.replayAll (); baeldungReader.readNext (); baeldungReader.write ("cím", "tartalom"); easyMockSupport.verifyAll (); }

Korábban statikus módszereket vagy annotációkat használtunk gúnyok létrehozására és kezelésére. A motorháztető alatt ezeket a statikus és kommentált gúnyokat egy globális irányítja EasyMockSupport példa.

Itt kifejezetten példányosítottuk, és ezeket a gúnyokat saját hatáskörünkbe vesszük, delegálás útján. Ez segíthet elkerülni az összetévesztést, ha bármilyen névütközés van a tesztkódban az EasyMock programmal, vagy vannak hasonló esetek.

8. Következtetés

Ebben a cikkben röviden bemutattuk az EasyMock alapvető használatát, azzal kapcsolatban, hogy miként lehet előállítani csúfolt objektumokat, rögzíteni és visszajátszani a viselkedésüket, és ellenőrizni, hogy megfelelően viselkedtek-e.

Ha érdekel, nézze meg ezt a cikket az EasyMock, a Mocket és a JMockit összehasonlításához.

Mint mindig, a teljes megvalósítás megtalálható a Githubon.


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