Fork me on GitHub

Programming Design Notes

Maven 使用 Jboss Embedded 去測試 Seam 元件 (Unit Test)

| Comments

Maven 的測試中要測試 Seam 元件是需要一個 Java EE 的環境去運行 Seam,而 Jboss 亦提供了一個 Java EE 的環境去幫助我們去測試 Seam 元件,這個就是 Jboss Embedded。使用 Jboss Embedded 加上 TestNG 這一套 Testing Framework,很簡單就可以做到全自動測試。

首先要在 pom.xml 去加入以下的 dependency:
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>5.14.2</version>
<type>jar</type>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.jboss.seam.embedded</groupId>
<artifactId>jboss-embedded-api</artifactId>
<version>beta3.SP12</version>
<type>jar</type>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.jboss.microcontainer</groupId>
<artifactId>jboss-deployers-client-spi</artifactId>
</exclusion>
<exclusion>
<groupId>org.jboss.microcontainer</groupId>
<artifactId>jboss-deployers-core-spi</artifactId>
</exclusion>
</exclusions>
</dependency>

<dependency>
<groupId>org.jboss.seam.embedded</groupId>
<artifactId>jboss-embedded-all</artifactId>
<version>beta3.SP12</version>
<type>jar</type>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.jboss.seam.embedded</groupId>
<artifactId>thirdparty-all</artifactId>
<version>beta3.SP12</version>
<type>jar</type>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.jboss.seam.embedded</groupId>
<artifactId>hibernate-all</artifactId>
<version>beta3.SP12</version>
<type>jar</type>
<scope>test</scope>
</dependency>

<dependency>
<groupId>javax.faces</groupId>
<artifactId>jsf-api</artifactId>
<version>1.2_13</version>
<type>jar</type>
<scope>test</scope>
</dependency>

加入後就到在 Seam 的下載檔案內找出 bootstrap 這個資料夾,然將這個資料夾複製到 Maven Project 的 src/test/resource 下,這個資料夾是起動 Jboss Embedded 的設定檔案。

再到 pom.xml 加入以下的 plugin:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<useManifestOnlyJar>false</useManifestOnlyJar>
<forkMode>once</forkMode>
<argLine>-Dsun.lang.ClassLoader.allowArraySyntax=true</argLine>
<additionalClasspathElements>
<additionalClasspathElement>${basedir}/src/resource/bootstrap</additionalClasspathElement>
</additionalClasspathElements>
<suiteXmlFiles>
<suiteXmlFile>${project.build.testOutputDirectory}/testing.xml</suiteXmlFile>
</suiteXmlFiles>
<classpathDependencyExcludes>
<classpathDependencyExclude>javaee:javaee-api</classpathDependencyExclude>
<classpathDependencyExclude>javax.ejb:ejb-api</classpathDependencyExclude>
</classpathDependencyExcludes>
</configuration>
</plugin>

如果你的 pom.xml 有加入到 javaee-apiejb-api 的 dependency,在測試時不要將這 2 個 JAR 加到 Classpath 中,Jboss Embedded 會不能起動的。

如果要連接 Database,可以在 src/test/resource/META-INF 加入一個 xxx-ds.xml 去設定 Data SourceJboss Embedded 會自動加入此 Data Source

Data Source 的大概是以下的樣子:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE datasources
PUBLIC "-//JBoss//DTD JBOSS JCA Config 1.5//EN"
"http://www.jboss.org/j2ee/dtd/jboss-ds_1_5.dtd">
<datasources>

<local-tx-datasource>
<jndi-name>jdbc/ctlok</jndi-name>
<use-java-context>true</use-java-context>
<connection-url>jdbc:oracle:thin:@pro.ctlok.com:1521:ctlok</connection-url>
<driver-class>oracle.jdbc.OracleDriver</driver-class>
<user-name>ctlok</user-name>
<password>ctlok</password>
</local-tx-datasource>

</datasources>

persistence.xml 使用 java:jdbc/ctlokJNDI 就可以找到 Data Source 了。

設定大致上完成了,可以寫一些 Test Class 去測試一下。

相關書籍: Seam in ActionSeam Framework: Experience the Evolution of Java EE (2nd Edition)Practical JBoss® Seam Projects