Testování EJB


V poslední době jsem byl nucen se věnovat vývoji aplikace s nálepkou Enterprise a to tak, že používám EJB. Možná někdy časem budu moci prozradit, co je to za aplikaci a přidat nějaké informace o tom, jak jsem co navrhoval a realizoval, zatím však budu mlčet jako hrob. Pootevřenej – potřeboval jsem testovat a to bych to zmínit mohl, protože jsem tomu nějaký čas dal.

Pro některé beany (transformátory) bylo možné napsat jednotkové testy, které nepotřebovaly pro svůj běh EJB kontejner – prostě bylo možné vytvořit instanci dané třídy, provést transformaci (či validaci) a podívat se, jaký je výsledek. Pro další služby jsem už ovšem EJB kontejner potřeboval – takže  bylo potřeba jej buď spustit, nebo nasimulovat (pěkně to zblognul před mnoha lety finc, který odkazuje na Ejb3unit, ještě dříve krecan odkázal ve spojitosti se Springem na Pitchfork – přiznám se, vyprdl jsem se na oba).

Nejprve jsem uvažoval nad embeded glassfishem, ale zdálo se mi to úchylné, tak jsem rozhodil síť na twitteru a ozval se @dblevins s odkazy, jak je to pácháno na OpenEJB. To jsem zkoušel mimo video je to pěkně popsáno třeba zde), ale končil jsem s

[sourcecode language=“plain“]java.lang.ClassFormatError: Absent Code attribute in method that is not native or abstract in class file javax/ejb/embeddable/EJBContainer
[/sourcecode]

což se opakovalo, i když jsem se snažil vygooglit řešení a různě si s tím hrál. Podle všeho jsou knihovny pouze abstrakce a vlastní implementaci vkládá až zvolený kontejner, alespoň tak jsem to pochopil. Takže jsem se ve finále rozhodl jít cestou onoho embedded kontejneru.

Protože vyvíjím pro Glassfishe, padla volba na použití embedded glassfishe. Nejprve jsem se inspiroval Adamem Bienem a pokoušel se vytvořit archiv a ten následně deploynout, což však samozřejmě nebyla správná cesta. Hledal jsem dále a konečně objevil něco funkčního – vytvoření kontejneru se zkompilovanými classami a získání kontextu, nad kterým je možné provádět lookup. Teď bych sepsal kroky, jak jsem to celé zjednodušil a nacpal do ukázkového projektu.

Nejprve si vytvořme nový projekt pomocí mavenu

[sourcecode language=“plain“]mvn archetype:create -DarchetypeGroupId=org.apache.maven.archetypes -DgroupId=cz.shmoula -DartifactId=ejbTesting[/sourcecode]

následně je vhodné změnit pom.xml dle výše uvedeného zdroje – přidat závislost a parametry, případně repozitář

[sourcecode language=“plain“]. . .
<dependency>
<groupId>org.glassfish.extras</groupId>
<artifactId>glassfish-embedded-all</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
. . .
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.0.2</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
</plugins>
</build>
. . .
<repository>
<id>glassfish-repository</id>
<url>http://download.java.net/maven/glassfish</url>
</repository>
[/sourcecode]

Teď je možné přidat například lokální stateless bean a jednoduše jej otestovat, část TestCase je uvedena níže. Za povšimnutí stojí především specifikace cesty, kde se nalézají classes, vytvoření (a uzavření) kontejneru a získání kontextu a dohledání pokusného beanu.

[sourcecode language=“java“]@Override
@Before
protected void setUp() throws Exception {
Map<String, Object> properties = new HashMap<String, Object>();
properties.put(EJBContainer.MODULES, new File("target/classes"));
properties.put("org.glassfish.ejb.embedded.glassfish.installation.root", "glassfish");
properties.put(EJBContainer.APP_NAME, "pokus");

container = EJBContainer.createEJBContainer(properties);
Context ic = container.getContext();

Object o = ic.lookup("java:global/pokus/Pokus");
if(o instanceof Pokus)
this.pokus = (Pokus) o;
}

@Override
@After
protected void tearDown() throws Exception {
container.close();
}

@Test
public void testPokus(){
assertNotNull(pokus);
}

@Test
public void testScitani(){
assertEquals(9, pokus.scitani(5, 4));
}[/sourcecode]

To by mohlo být vše, teď to nějak aplikuju na WS, snad se to tak používá (chci testovat služby na straně serveru) a potom zkusím vkládat Messages na jazyk MDB :-). Nakonec to zas až tak nebolelo, i když mi připadá hodně úchylné ono spouštění embedded kontejneru. Je škoda, že v oficiální dokumentaci se o testování nic nepíše (nebo jsem to přehlédl? prosím link).


Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *