Das Testen von J2EE war ja immer pain in the ass, dass kam JEE mit EJB 3, alles war ein POJO und siehe da: man brauchte keinen Application-Server mehr, um seine Logik zu testen (in den meisten Fällen zumindest). Dann kam Arquillian, weil man sah, dass man ggf. doch mal einen Application-Server benötigt für sinnvolle Tests. “Arquillian enables you to test your business logic in a remote or embedded container”, so steht es auf der Webseite und da ich ein ungeduldiger Mensch bin, der immer mit dem blutige-Kante-Spielzeug spielen möchte, habe ich mir vorgenommen, Arquillian zusammen mit dem JBoss 7 CR1b zu testen. Nach einem guten Tag, diversen Flüchen und viel Google-Magic hatte ich dann endlich eine lauffähige Variante implementiert. Als zusätzliche Schwierigkeit habe ich mir gedacht, dass eine Maven-Integration eine feine Sache sei. Problematisch war auch, dass die Arquillian-Doku auf der Webseite etwas veraltet ist, was die Problemlösung signifikant erschwert hat. Wie dem auch sei, im Folgenden ist mein Ansatz zu sehen:
1) Ich habe mir nicht die Mühe gemacht, die Dependencies der einzelnen Maven-Module per Hand aufzulösen (mit den unterschiedlichen Versionen), glücklicherweise gibt es ein DependencyManagement-Modul für Arquillian:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.jboss.arquillian</groupId>
<artifactId>arquillian-bom</artifactId>
<version>1.0.0.CR7</version>
<scope>import</scope>
<type>pom</type>
</dependency>
</dependencies>
</dependencyManagement>
2) Die einzelnen Dependencies lauten wie folgt:
<dependency>
<groupId>org.jboss.as</groupId>
<artifactId>jboss-as-arquillian-container-managed</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jboss.arquillian.protocol</groupId>
<artifactId>arquillian-protocol-servlet</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jboss.arquillian.junit</groupId>
<artifactId>arquillian-junit-container</artifactId>
<scope>test</scope>
</dependency>
In diesem Fall habe ich die managed-Variante (eine andere JVM, der selbe Rechner) genommen, weil embedded-Variante (die selbe JVM) zur Zeit nicht implementiert ist. Ich hoffe, das ändert sich noch.
3) Meine arquillian.xml-Datei sieht folgendermaßen aus:
>?xml version="1.0" encoding="UTF-8"?>
>arquillian xmlns="http://jboss.org/schema/arquillian"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://jboss.org/schema/arquillian http://jboss.org/schema/arquillian/arquillian_1_0.xsd">
>engine>
>property name="deploymentExportPath">target>/property>
>/engine>
>container qualifier="jbossas7">
>protocol type="jmx-as7">
>property name="executionType">REMOTE>/property>
>/protocol>
>configuration>
>property name="javaHome">C:/Java/jdk1.6.0_27>/property>
>property name="jbossHome">C:/jboss-as-7.1.0.CR1b>/property>
>property name="managementAddress">127.0.0.1>/property>
>property name="managementPort">9999>/property>
>/configuration>
>/container>
>/arquillian>
4) Meine persistence.xml-Datei war – mehr oder weniger – eine Standard-Datei, die auf die hsqldb verwiesen hat.
Der eigentliche Test war etwas komplexer, z.B. habe ich statt @EJB die CDI-Annotation @Inject verwendet, da die andere Annotation nicht funktioniert hat. Mein Template für Testklassen sieht folgendermaßen aus:
@RunWith(Arquillian.class)
public class FooBarDaoArqTest {
@Deployment
public static JavaArchive createTestArchive() {
return ShrinkWrap
.create(JavaArchive.class, "test.jar")
.addClasses(FooBarDao.class, ...)
.addAsManifestResource(
new File("src/test/resources/persistence.xml"),
ArchivePaths.create("persistence.xml"))
.addAsManifestResource(EmptyAsset.INSTANCE, ArchivePaths.create("beans.xml"));
}
@Inject
private FooBarDao dao;
@PersistenceContext(unitName = "ExampleDS")
private EntityManager em;
@Before
public void setUp() throws Exception {
HibernateEntityManager hem = em.unwrap(HibernateEntityManager.class);
Session session = hem.getSession();
...
}
@Test
public void testCRUD() throws Exception {
...
}
Damit ist es nun möglich, Arquillian mit JBoss 7 CR1b und Maven zu verheiraten.


0 Comments