JBoss 7 und Arquillian

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.

{lang: 'de'}

flattr this!

0 Comments

  1. There are no comments yet.

Add Your Comment

Make sure you share your opinion with us. Fields marked * are required. Any other information is optional and for your own pleasure. Your email address will be hidden and never published or used in any way.


Optional Details

If you like you can tell us your website URL and Twitter Username. We'll link your name to your web address and we'll add a twitter link to your comment. This is completely optional.