Esetenként nehéz elkülöníteni a tesztelendő kódot más osztályoktól (gondoljunk csak a session beanekben jelen lévő erőforrásokra: EntityManager, SessionContext stb.) A jMock egy osztálykönyvtár, amely ún. mock objektumok (álobjektumok) segítségével teszi egyszerűen tesztelhetővé az ilyen kódokat.
A mock objektumok lényegében más, meglévő osztályokat emulálnak úgy, hogy szabályozható a meghívható és a nem meghívható metódusok köre, meghatározhatóak a metódusok visszatérési értékei, feltételek szabhatóak a metódusok bemeneti paramétereire, vagy akár kivétel is dobható. Egy EntityManager példányt használó osztály (végletekig leegyszerűsített) tesztelése a 27. ábrán látható.
Mockery context = new Mockery(); SiteCheckServiceLocal siteCheck = new SiteCheckServiceBean(); // EntityManager mock objektum létrehozása final EntityManager em = context.mock(EntityManager.class); // mock EntityManager beszúrása reflection-nel Field emField = SiteCheckServiceBean.class.getDeclaredField("em"); emField.setAccessible(true); emField.set(siteCheck, em); // elvárások, engedélyezett metódusok és visszatérési // értékeik meghatározása final URL url1 = new URL(...); context.checking(new Expectations() {{ one (em).find(URL.class, 123L); will(returnValue(url1)); }}); // eredeti kód meghívása siteCheck.checkUrl(123L);
27. ábra: Egy EntityManager-t használó osztály jMock-al történő tesztelése
A context.mock() hívás létrehozza a mock objektumot, amit reflection-nel beillesztünk a tesztelendő session bean példányba (SiteCheckServiceBean, illetve siteCheck). Ezután a context.checking() metódusnak megadjuk az injektált ál-EntityManageren meghívható metódusokat és az ezekhez rendelt visszatérési értékeket. Jelenleg a find metódus hívható pontosan egyszer az ábrán látható két paraméterrel. A híváshoz meghatározott visszatérési érték az url1 objektumra mutató referencia. Az EntityManager példányra vonatkozó más hívások esetén a teszt sikertelen lesz.
Legutóbbi hozzászólások
9 év 18 hét
10 év 7 hét
10 év 11 hét
10 év 29 hét
11 év 31 hét
11 év 36 hét
11 év 36 hét
11 év 37 hét
11 év 47 hét
12 év 18 hét