Úvod do EasyMock

1. Úvod

V minulosti sme intenzívne hovorili o programoch JMockit a Mockito.

V tomto tutoriále predstavíme ďalší zosmiešňovací nástroj - EasyMock.

2. Maven závislosti

Predtým, ako sa ponoríme, pridajme k našej nasledujúcej závislosti pom.xml:

 org.easymock easymock test 3.5.1 

Najnovšiu verziu nájdete vždy tu.

3. Základné koncepty

Pri generovaní falošného môžeme simulovať cieľový objekt, určiť jeho správanie a nakoniec overiť, či sa používa podľa očakávania.

Práca s maketami EasyMock zahŕňa štyri kroky:

  1. vytvorenie simulácie cieľovej triedy
  2. zaznamenanie jeho očakávaného správania vrátane akcie, výsledku, výnimiek atď.
  3. používanie falošných testov
  4. overenie, či sa správa podľa očakávania

Po dokončení nahrávania ho prepneme do režimu „prehrávania“, aby sa falošný model choval pri spolupráci s akýmkoľvek objektom, ktorý ho bude používať, ako zaznamenaný.

Nakoniec overíme, či všetko prebieha podľa očakávaní.

Štyri vyššie uvedené kroky sa týkajú metód v org.easymock.EasyMock:

  1. predstieraný (...): generuje simuláciu cieľovej triedy, či už konkrétnej triedy alebo rozhrania. Po vytvorení je falošný model v režime „nahrávania“, čo znamená, že EasyMock zaznamená akúkoľvek akciu, ktorú Mock Object urobí, a prehrá ich v režime „znovu“
  2. očakávať (...): pomocou tejto metódy môžeme nastaviť očakávania súvisiace s akciami nahrávania vrátane hovorov, výsledkov a výnimiek
  3. prehratie (...): prepne daného simulátora do režimu „prehrávania“. Akákoľvek akcia spúšťajúca predtým zaznamenané volania metód potom prehrá „zaznamenané výsledky“
  4. overiť (...): overuje, či boli splnené všetky očakávania a či nedošlo k falošnému hovoru

V nasledujúcej časti si ukážeme, ako tieto kroky fungujú v praxi, pomocou príkladov z reálneho sveta.

4. Praktický príklad zosmiešňovania

Skôr ako pokračujeme, pozrime sa na príklad kontextu: povedzme, že máme čitateľa blogu Baeldung, ktorý rád listuje v článkoch na webe a potom sa pokúša písať články.

Začnime vytvorením nasledujúceho modelu:

public class BaeldungReader {private ArticleReader articleReader; súkromný IArticleWriter articleWriter; // konštruktory public BaeldungArticle readNext () {return articleReader.next (); } verejný Zoznam readTopic (téma reťazca) {návrat articleReader.ofTopic (téma); } public String write (Názov reťazca, obsah reťazca) {return articleWriter.write (názov, obsah); }}

V tomto modeli máme dvoch súkromných členov: articleReader(trieda betónu) a articleWriter (rozhranie).

Ďalej ich zosmiešňujeme, aby sme ich overili BaeldungReaderSprávanie.

5. Mock With Java Code

Začnime výsmechom Čítačka článkov.

5.1. Typické posmievanie sa

Očakávame articleReader.next () metóda, ktorá sa má volať, keď čitateľ preskočí článok:

@Test public void whenReadNext_thenNextArticleRead () {ArticleReader mockArticleReader = falošný (ArticleReader.class); BaeldungReader baeldungReader = nový BaeldungReader (mockArticleReader); expect (mockArticleReader.next ()). andReturn (null); replay (mockArticleReader); baeldungReader.readNext (); overiť (mockArticleReader); }

Vo vyššie uvedenom ukážkovom kóde sa striktne držíme 4-krokového postupu a vysmievame sa mu Čítačka článkov trieda.

Aj keď nás naozaj nezaujíma čo mockArticleReader.next () vráti, stále musíme určiť návratovú hodnotu pre mockArticleReader.next () používaním očakávať (...) .a návrat (...).

S očakávať (...), EasyMock očakáva, že metóda vráti hodnotu alebo hodí znak Výnimka.

Ak to jednoducho urobíme:

mockArticleReader.next (); replay (mockArticleReader);

EasyMock sa na to bude sťažovať, pretože si vyžaduje privolanie očakávať (...) .a návrat (...) ak metóda niečo vráti.

Ak je to neplatný metóda, môžeme očakávať jeho pôsobenie pomocou expectLastCall () Páči sa ti to:

mockArticleReader.someVoidMethod (); expectLastCall (); replay (mockArticleReader);

5.2. Znova prehrať objednávku

Ak potrebujeme, aby sa akcie opakovali v konkrétnom poradí, môžeme byť prísnejší:

@Test public void whenReadNextAndSkimTopics_thenAllAllowed () {ArticleReader mockArticleReader = strictMock (ArticleReader.class); BaeldungReade baeldungReader = nový BaeldungReader (mockArticleReader); expect (mockArticleReader.next ()). andReturn (null); expect (mockArticleReader.ofTopic ("easymock")). andReturn (null); replay (mockArticleReader); baeldungReader.readNext (); baeldungReader.readTopic ("easymock"); overiť (mockArticleReader); }

V tomto úryvku sme použitie strictMock (…) skontrolovať poradie volaní metód. Pre posmechy vytvorené predstieraný (...) a strictMock (…), akékoľvek neočakávané volania metód by spôsobili AssertionError.

Aby sme umožnili akékoľvek volanie metódy pre falošné, môžeme použiť niceMock (...):

@Test public void whenReadNextAndOthers_thenAllowed () {ArticleReader mockArticleReader = niceMock (ArticleReader.class); BaeldungReade baeldungReader = nový BaeldungReader (mockArticleReader); expect (mockArticleReader.next ()). andReturn (null); replay (mockArticleReader); baeldungReader.readNext (); baeldungReader.readTopic ("easymock"); overiť (mockArticleReader); }

Tu sme nečakali baeldungReader.readTopic (…) je potrebné zavolať, ale EasyMock sa nebude sťažovať. S niceMock (...), EasyMock sa teraz stará iba o to, či cieľový objekt vykonal očakávanú akciu alebo nie.

5.3. Posmievanie sa Výnimka Vrhá

Teraz pokračujme v posmievaní sa rozhraniu IArticleWritera ako sa má s očakávaním zaobchádzať Vrhače:

@Test public void whenWriteMaliciousContent_thenArgumentIllegal () {// zosmiešňovanie a inicializácia očakávať (mockArticleWriter .write ("easymock", ""))) .andThrow (nový IllegalArgumentException ()); replay (mockArticleWriter); // napisat škodlivy obsah a zachytit vynimku podla ocakavaniException verify (mockArticleWriter); assertEquals (IllegalArgumentException.class, expectException.getClass ()); }

V úryvku vyššie očakávame articleWriter je dostatočne pevný na detekciu útokov XSS (Cross-site Scripting).

Takže keď sa čitateľ pokúsi vložiť do obsahu článku škodlivý kód, autor by mal hodiť znak IllegalArgumentException. Toto očakávané správanie sme zaznamenali pomocou očakávať (...). a hodiť (...).

6. Vysmievať sa s anotáciou

EasyMock podporuje aj vkladanie falošných správ pomocou anotácií. Aby sme ich mohli použiť, musíme spustiť naše jednotkové testy s EasyMockRunner aby sa to spracovalo @Mock a @TestSubject anotácie.

Prepíšeme predchádzajúce úryvky:

@RunWith (EasyMockRunner.class) verejná trieda BaeldungReaderAnnotatedTest {@Mock ArticleReader mockArticleReader; @TestSubject BaeldungReader baeldungReader = nový BaeldungReader (); @Test public void whenReadNext_thenNextArticleRead () {expect (mockArticleReader.next ()). AndReturn (null); replay (mockArticleReader); baeldungReader.readNext (); overiť (mockArticleReader); }}

Rovná sa predstieraný (...), falošný bude vložený do polí s poznámkami @Mock. A tieto posmešky budú vpichnuté do polí triedy s poznámkami @TestSubject.

V úryvku vyššie sme explicitne neinicializovali articleReader pole v baeldungReader. Pri volaní baeldungReader.readNext (), môžeme to implicitne nazvať mockArticleReader.

Bolo to preto mockArticleReader bol injikovaný do articleReader lúka.

Upozorňujeme, že ak namiesto testovacieho programu chceme použiť iného testovacieho bežca EasyMockRunner, môžeme použiť testovacie pravidlo JUnit EasyMockRule:

verejná trieda BaeldungReaderAnnotatedWithRuleTest {@Rule public EasyMockRule mockRule = nové EasyMockRule (toto); // ... @Test public void whenReadNext_thenNextArticleRead () {expect (mockArticleReader.next ()). AndReturn (null); replay (mockArticleReader); baeldungReader.readNext (); overiť (mockArticleReader); }}

7. Vysmievať sa EasyMockSupport

Niekedy musíme v jednom teste zaviesť viac posmeškov a musíme to opakovať manuálne:

repríza (A); repríza (B); repríza (C); // ... overiť (A); overiť (B); overiť (C);

To je škaredé a potrebujeme elegantné riešenie.

Našťastie máme triedu EasyMockSupport v EasyMock pomôcť pri riešení tohto problému. To pomáha sledovať falošné správy, aby sme ich mohli prehrať a overiť v nich dávka ako je táto:

// ... public class BaeldungReaderMockSupportTest extends EasyMockSupport {// ... @Test public void whenReadAndWriteSequencially_thenWorks () {expect (mockArticleReader.next ()). andReturn (null) .times (2) .andThrow (new NoSuchElement) ; expect (mockArticleWriter.write ("title", "content")) .andReturn ("BAEL-201801"); replayAll (); // vykonávanie operácií čítania a zápisu za sebou nadväzujúcich verifikáciíAll (); assertEquals (NoSuchElementException.class, expectException.getClass ()); assertEquals ("BAEL-201801", articleId); }}

Tu sme sa vysmievali obom articleReader a articleWriter. Pri nastavovaní týchto posmeškov na režim „prehrávania“ sme použili statickú metódu replayAll () poskytuje EasyMockSupporta použité verifyAll () na hromadné overenie ich správania.

Tiež sme predstavili krát (…) metóda v očakávať fáza. Pomáha určiť, koľkokrát očakávame, že sa metóda bude volať, aby sme sa vyhli zavedeniu duplicitného kódu.

Môžeme tiež použiť EasyMockSupport prostredníctvom delegácie:

EasyMockSupport easyMockSupport = nový EasyMockSupport (); @Test public void whenReadAndWriteSequencially_thenWorks () {ArticleReader mockArticleReader = easyMockSupport .createMock (ArticleReader.class); IArticleWriter mockArticleWriter = easyMockSupport .createMock (IArticleWriter.class); BaeldungReader baeldungReader = nový BaeldungReader (mockArticleReader, mockArticleWriter); expect (mockArticleReader.next ()). andReturn (null); expect (mockArticleWriter.write ("title", "content")) .andReturn (""); easyMockSupport.replayAll (); baeldungReader.readNext (); baeldungReader.write ("názov", "obsah"); easyMockSupport.verifyAll (); }

Predtým sme na vytváranie a správu falošných správ používali statické metódy alebo anotácie. Pod kapotou sú tieto statické a komentované posmechy riadené globálom EasyMockSupport inštancia.

Tu sme to výslovne vytvorili a prostredníctvom delegovania prevezmeme všetky tieto posmešky pod našu vlastnú kontrolu. To môže pomôcť vyhnúť sa nejasnostiam, ak v testovacom kóde dôjde k konfliktu názvov s programom EasyMock alebo k podobným prípadom.

8. Záver

V tomto článku sme stručne predstavili základné použitie EasyMocku o tom, ako generovať falošné objekty, zaznamenávať a prehrávať ich správanie a overovať, či sa správajú správne.

V prípade, že by vás zaujímalo, porovnajte EasyMock, Mocket a JMockit v tomto článku.

Celú implementáciu nájdete ako vždy na Githube.


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