JMockit 101

1. Úvod

V tomto článku začneme novú sériu sústredenú okolo posmešnej sady nástrojov JMockit.

V tejto prvej časti si povieme, čo je JMockit, aké sú jeho vlastnosti a ako sa s ním vytvárajú a používajú falošné správy.

Neskôr sa články zamerajú na jeho schopnosti a pôjdu hlbšie.

2. JMockit

2.1. Úvod

Najskôr si povieme, čo je to JMockit: rámec Java pre posmievanie sa objektov v testoch (môžete ho použiť pre JUnit aj TestNG).

Používa inštrumentačné rozhrania API Java na úpravu bajtkódu tried za behu, aby sa dynamicky zmenilo ich správanie. Medzi silné stránky patrí jeho expresivita a schopnosť predstierať statické a súkromné ​​metódy.

Možno ste v JMockite nováčikom, ale určite to nie je kvôli tomu, že je nový. Vývoj JMockit sa začal v júni 2006 a jeho prvé stabilné vydanie sa datuje na december 2012, takže už nejaký čas existuje (aktuálna verzia je v čase písania článku 1,24).

2.2. Maven závislosť

Najskôr do nášho projektu budeme musieť pridať závislosť jmockit:

 org.jmockit jmockit 1,41 

2.3. Vyjadriteľnosť JMockit

Ako už bolo povedané, jednou z najsilnejších stránok JMockitu je jeho expresivita. Ak chcete vytvoriť falošné správy a definovať ich správanie, musíte namiesto volania metód z falošného rozhrania API iba definovať priamo.

To znamená, že nebudete robiť napríklad:

API.expect (mockInstance.method ()). AndThenReturn (hodnota). Krát (2);

Namiesto toho môžete očakávať napríklad:

new Expectation () {mockInstance.method (); výsledok = hodnota; krát = 2; }

Mohlo by sa zdať, že ide o viac kódu, ale všetky tri riadky by ste mohli jednoducho dať iba na jeden. Skutočne dôležitou súčasťou je, že neskončíte s veľkým „vlakom“ reťazených volaní metód. Namiesto toho skončíte s definíciou toho, ako chcete, aby sa falošný správal, keď ho zavoláte.

Ak vezmete do úvahy, že na výsledok = hodnota časť, ktorú by ste mohli vrátiť čokoľvek (pevné hodnoty, dynamicky generované hodnoty, výnimky atď.), sa expresivita JMockit stáva ešte zreteľnejšou.

2.4. Model Record-Replay-Verify

Testy pomocou programu JMockit sú rozdelené do troch diferencovaných etáp: zaznamenanie, prehranie a overenie.

  1. Na záznam fázy, počas prípravy testu a pred vyvolaním metód, ktoré chceme vykonať, definujeme očakávané správanie pre všetky testy, ktoré sa majú použiť v nasledujúcej fáze.
  2. The repríza fáza je fáza, v ktorej sa vykonáva testovaný kód. Vyvolanie zosmiešňovaných metód / konštruktorov, ktoré boli predtým zaznamenané v predchádzajúcej fáze, sa teraz prehrá.
  3. A nakoniec, na overiť fázy, budeme tvrdiť, že výsledkom testu bol ten, ktorý sme očakávali (a že sa vysmievali a správali sa podľa toho, čo bolo definované vo fáze záznamu).

V príklade kódu by drôtový model na test vyzeral asi takto:

@Test public void testWireframe () {// prípravný kód, ktorý nie je špecifický pre JMockit, ak existujú nejaké nové Expectations () {{// definujú očakávané správanie pre falošné}}; // vykonať test pod kódom nové Verifikácie () {{// verifikovať falošné}}; // tvrdenia}

3. Vytváranie makiet

3.1. Anotácie JMockit

Keď používate JMockit, najjednoduchší spôsob, ako používať falošné správy, je používať anotácie. Existujú tri na vytváranie falošných správ (@Mocked, @Injectable a @ Zachytávanie) a jeden na určenie triedy, ktorá sa má testovať (@ Testované).

Pri použití @Mocked anotácie v poli, vytvorí sa vysmievané inštancie každého nového objektu konkrétnej triedy.

Na druhej strane s @Injectable anotácie, vytvorí sa iba jedna zosmiešnená inštancia.

Posledná anotácia, @ Zachytávanie bude sa správať ako @Mocked, ale rozšíri svoj dosah na každú podtriedu rozširujúcu alebo implementujúcu typ anotovaného poľa.

3.2. Predkladanie argumentov k testom

Pri použití JMockit je možné testovať parametre ako falošné. To je celkom užitočné na vytvorenie simulácie iba pre jeden konkrétny test, napríklad ako komplexný objekt modelu, ktorý vyžaduje konkrétne správanie napríklad len pre jeden test. Bolo by to asi takto:

@RunWith (JMockit.class) verejná trieda TestPassingArguments {@Injectable private Foo mockForEveryTest; @ Vyskúšaný súkromný barový bar; @Test public void testExample (@Mocked Xyz mockForJustThisTest) {new Expectations () {{mockForEveryTest.someMethod ("foo"); mockForJustThisTest.someOtherMethod (); }}; bar.codeUnderTest (); }}

Tento spôsob vytvorenia simulácie jej odovzdaním ako parametra, namiesto toho, aby sme museli volať nejakú metódu API, nám opäť ukazujú expresivitu, o ktorej hovoríme od začiatku.

3.3. Kompletný príklad

Na konci tohto článku uvedieme kompletný príklad testu pomocou nástroja JMockit.

V tomto príklade budeme testovať a Účinkujúci trieda, ktorá používa Spolupracovník v jeho hrať() metóda. Toto hrať() metóda, prijíma a Model objekt ako parameter, z ktorého bude používať svoj dostať informácie() ktorý vráti String, tento String bude odovzdaný do spolupracovať () metóda z Spolupracovník to sa vráti pravda pre tento konkrétny test a táto hodnota bude odovzdaná príjem () metóda z Spolupracovník.

Testované triedy teda budú vyzerať takto:

public class Model {public String getInfo () {return "info"; }} public class Collaborator {public boolean spolupracovať (reťazec reťazca) {return false; } public void receive (boolean bool) {// NOOP}} public class Performer {private Collaborator spolupracovník; public void perform (Model model) {boolean value = spolupracovnik.spolupracovat (model.getInfo ()); spolupracovník.prijať (hodnota); }}

A kód testu bude ako:

@RunWith (JMockit.class) verejná trieda PerformerTest {@Injectable private Collaborator spolupracovník; @ Testovaný súkromný umelec; @Test public void testThePerformMethod (@Mocked Model model) {new Expectations () {{model.getInfo (); result = "bar"; spolupracovník.spolupráca („lišta“); výsledok = pravda; }}; performer.perform (model); new Verifications () {{spolupracovník.prijať (true); }}; }}

4. Záver

Týmto zhrnieme naše praktické úvodné slovo do JMockitu. Ak sa chcete dozvedieť viac informácií o JMockite, buďte pripravení na ďalšie články.

Celú implementáciu tohto tutoriálu nájdete v projekte GitHub.

4.1. Články v seriáli

Všetky články zo série:

  • JMockit 101
  • Sprievodca po JMockit - očakávania
  • Pokročilé použitie JMockit

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