JMockit 101

1. Bemutatkozás

Ezzel a cikkel egy új sorozatot indítunk, amelynek középpontjában a JMockit gúnyos eszköztár áll.

Ebben az első részben arról fogunk beszélni, hogy mi is a JMockit, annak jellemzőiről és arról, hogy a gúnyok hogyan jönnek létre és hogyan használhatók vele.

A későbbi cikkek a képességeire összpontosítanak, és mélyebben elmélyítik azokat.

2. JMockit

2.1. Bevezetés

Először is beszéljünk arról, hogy mi a JMockit: Java keretrendszer az objektumok gúnyolásához a tesztekben (használhatja mind a JUnit, mind a TestNG elemekhez).

A Java műszeres API-jait használja az osztályok bájtkódjának a futás közbeni módosítására annak érdekében, hogy dinamikusan megváltoztassa viselkedésüket. Néhány erős pontja a kifejezhetőség és a statikus és privát módszerek gúnyolódása.

Lehet, hogy új vagy a JMockit számára, de ez biztosan nem annak köszönhető, hogy új. A JMockit fejlesztése 2006 júniusában kezdődött, és az első stabil kiadása 2012 decemberéig nyúlik vissza, tehát már egy ideje létezik (a cikk írásakor a jelenlegi verzió 1.24).

2.2. Maven-függőség

Először hozzá kell adnunk a jmockit függőséget a projektünkhöz:

 org.jmockit jmockit 1.41 

2.3. A JMockit kifejezhetősége

Mint korábban elmondtuk, a JMockit egyik legerősebb pontja a kifejezhetősége. Gúnyok létrehozásához és viselkedésük definiálásához ahelyett, hogy metódusokat hívna a gúnyos API-ból, csak közvetlenül meg kell határoznia őket.

Ez azt jelenti, hogy nem fog ilyen dolgokat csinálni:

API.expect (mockInstance.method ()) ésThenReturn (érték) .times (2);

Ehelyett olyan dolgokra számíthat, mint:

új Várakozás () {mockInstance.method (); eredmény = érték; idők = 2; }

Úgy tűnhet, hogy ez több kód, de egyszerűen mindhárom sort csak egyre teheti. Az igazán fontos rész az, hogy nem ér véget egy nagy „vonat” a láncolt módszeres hívásokkal. Ehelyett meghatározza, hogy hogyan akarja a gúny viselkedni, amikor hívják.

Ha ezt figyelembe veszi a eredmény = érték bármit visszaadhat (rögzített értékek, dinamikusan generált értékek, kivételek stb.), a JMockit kifejező képessége még nyilvánvalóbbá válik.

2.4. A Record-Replay-Verify modell

A JMockit segítségével végzett teszteket három differenciált szakaszra osztják: rögzítésre, visszajátszásra és ellenőrzésre.

  1. A rekord fázisban, a teszt előkészítése során és a végrehajtani kívánt módszerek meghívásai előtt meghatározzuk a várható viselkedést az összes tesztnél, amelyet a következő szakaszban kell használni.
  2. A visszajátszás fázis az, amelyben a tesztelt kód futtatásra kerül. Az előző szakaszban korábban rögzített csúfolt módszerek / konstruktorok invokációit most újra lejátszjuk.
  3. Végül a igazolja szakaszban azt állítjuk, hogy a teszt eredménye az volt, amire számítottunk (és hogy a gúnyok a rekordfázisban meghatározottak szerint viselkedtek és használták őket).

Kódpéldával a teszt drótváza így néz ki:

@Test public void testWireframe () {// a JMockitra nem jellemző felkészülési kód, ha van új Expectations () {{// definiálja a várható viselkedést a gúnyokhoz}}; // végrehajtja a tesztelés alatt lévő új ellenőrzést () {{// igazolja a gúnyokat}}; // állítások}

3. Gúnyok létrehozása

3.1. JMockit kommentárjai

A JMockit használatakor a gúnyolódás legegyszerűbb módja a kommentárok használata. Háromféle lehet a gúnyok létrehozására (@ Kigúnyolva, @ Injekciós és @ Elfogás) és egy a tesztelt osztály megadására (@Tesztelve).

A @Mocked egy mezőben egy kommentár, akkor az adott osztály minden egyes új objektumának csúfolt példányait hozza létre.

Másrészt a @ Injekciós annotációval csak egy csúfolt példány jön létre.

Az utolsó feljegyzés, @ Elfogás úgy fog viselkedni @Mocked, de kiterjeszti az elérését minden olyan alosztályra, amely kiterjeszti vagy megvalósítja a jegyzetelt mező típusát.

3.2. Érvek átadása a teszteknek

A JMockit használatakor át lehet adni az álokat tesztparaméterként. Ez nagyon hasznos egy olyan modell létrehozásához, amely különösen az egyik teszthez hasonlít, mint például egy olyan komplex modellobjektumhoz, amelynek csak egy teszthez van szüksége konkrét viselkedésre. Valami ilyesmi lenne:

@RunWith (JMockit.class) nyilvános osztály TestPassingArguments {@Injectable private Foo mockForEveryTest; @Tesztelt privát bár bár; @Test public void testExample (@Mocked Xyz mockForJustThisTest) {new Expectations () {{mockForEveryTest.someMethod ("foo"); mockForJustThisTest.someOtherMethod (); }}; bar.codeUnderTest (); }}

A makett létrehozásának ez a módja úgy, hogy paraméterként adja át, ahelyett, hogy valamilyen API-módszert kellene meghívni, ismét megmutatja a kifejezhetőséget, amelyről a kezdetektől fogva beszélünk.

3.3. Teljes példa

A cikk befejezéséhez a JMockit használatával végzett teszt teljes példáját fogjuk tartalmazni.

Ebben a példában teszteljük a Előadó osztály, amely használja Együttműködő annak teljesít () módszer. Ez teljesít () módszer, megkapja a Modell objektum, mint paraméter, amelytől használni fogja szerezz információt() amely String-et ad vissza, ez a String átkerül a együttműködik() módszer től Együttműködő hogy visszatér igaz erre a tesztre, és ez az érték átkerül a kap() módszer től Együttműködő.

Tehát a tesztelt osztályok így fognak kinézni:

public class Model {public String getInfo () {return "info"; }} public class Collaborator {nyilvános logikai együttműködés (String string) {return false; } public void fogadja (logikai bool) {// NOOP}} public class Előadó {private Collaborator munkatárs; public void perform (Modellmodell) {logikai érték = munkatárs.együttműködés (model.getInfo ()); munkatárs.kapni (érték); }}

És a teszt kódja a következő lesz:

@RunWith (JMockit.class) nyilvános osztály PerformerTest {@Injectable private Collaborator munkatárs; @Tesztelt privát előadóművész; @Test public void testThePerformMethod (@Mocked Model model) {new Expectations () {{model.getInfo (); result = "bar"; munkatárs.együttműködés ("bár"); eredmény = igaz; }}; előadó.teljesít (modell); új Ellenőrzések () {{munkatárs.fogad (igaz); }}; }}

4. Következtetés

Ezzel áttekintjük a JMockit gyakorlati bevezetőjét. Ha többet szeretne megtudni a JMockitról, figyelje a jövőbeni cikkeket.

Az oktatóanyag teljes megvalósítása megtalálható a GitHub projektben.

4.1. A sorozat cikkei

A sorozat összes cikke:

  • JMockit 101
  • Útmutató a JMockithoz - elvárások
  • JMockit Advanced Usage