12.3. jMock

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.

Tartalom átvétel