nekop's blog

OpenShift / JBoss / WildFly / Infinispanの中の人 http://twitter.com/nekop

Arquillianを使った本物のJava EEテスト

JBoss Advent Calendar 2011の17日目のエントリです。

JBoss AS 7でJavaMailを利用してメールを送るCDIのBeanを作りましたが、それをテストするためにわざわざJSF2の画面を作りました。今回は画面を作るのではなく、Arquillianを使って自動テスト化します。Arquillianはおおざっぱに言うと自動テストでJava EEコンテナを利用可能にするソフトウェアです。

まずpom.xmlにテストのための依存を追加します。JUnitとArquillianのJUnit用モジュール、そして最後のXalan Serializerは本来はユーザが指定する必要のないものなのですが、現在はArquillianと関連するモジュールのバージョンアップのはざまですぽっと抜け落ちてしまっている状態なので今のところ手動で指定が必要です。

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.10</version>
  <scope>test</scope>
</dependency>
<dependency>
  <groupId>org.jboss.arquillian.junit</groupId>
  <artifactId>arquillian-junit-container</artifactId>
  <version>1.0.0.CR7</version>
  <scope>test</scope>
</dependency>
<!--
    This is an integration problem between jboss-javaee-web-6.0:2.0.0.Final and Arquillian, see:
    http://community.jboss.org/thread/165840
    http://community.jboss.org/thread/173846
-->
<dependency>
  <groupId>org.apache.xalan</groupId>
  <artifactId>serializer</artifactId>
  <version>2.7.1-1.jbossorg</version>
  <scope>test</scope>
</dependency>

引き続きArquillianを利用するテストのプロファイルを定義します。これでmvn -P arq-jbossas-remoteのようにプロファイル指定オプションを渡すことでArquillianを用いたテストが起動されます。remoteとかmanagedは後ほど実行するときに説明します。

<profile>
  <id>arq-jbossas-managed</id>
  <dependencies>
    <dependency>
      <groupId>org.jboss.as</groupId>
      <artifactId>jboss-as-arquillian-container-managed</artifactId>
      <version>7.1.0.Beta1b</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</profile>
<profile>
  <id>arq-jbossas-remote</id>
  <dependencies>
    <dependency>
      <groupId>org.jboss.as</groupId>
      <artifactId>jboss-as-arquillian-container-remote</artifactId>
      <version>7.1.0.Beta1b</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</profile>

さて、MailBean#sendTestMessage()をコールするテストケースを書きましょう。成功条件はメールの送信を実際に確認するようなものではなく、例外が起きなければ成功というユルいもので。

package jp.programmers.as7.mailsessiondemo;

import javax.inject.Inject;
import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.junit.Arquillian;
import org.jboss.shrinkwrap.api.Archive;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.asset.EmptyAsset;
import org.jboss.shrinkwrap.api.spec.JavaArchive;
import org.junit.Test;
import org.junit.runner.RunWith;
import static org.junit.Assert.*;

@RunWith(Arquillian.class)
public class MailBeanTest {
    @Inject
    MailBean mailBean;

    @Deployment
    public static Archive<?> createTestArchive() {
        return ShrinkWrap.create(JavaArchive.class, "test.jar")
            .addClasses(MailBean.class)
            .addAsResource(EmptyAsset.INSTANCE, "META-INF/beans.xml");
    }

    @Test
    public void callSendTestMessage() throws Exception {
        mailBean.sendTestMessage();
        assertTrue(true); // ok, no exception
    }
}

arq-jbossas-remoteプロファイルを利用して実行してみます。remoteプロファイルでは既に起動されているJBoss AS 7インスタンスに対してテストを行うモードです。事前にJBoss ASを起動しておいてください。

$ mvn -P arq-jbossas-remote test
(省略)
-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running jp.programmers.as7.mailsessiondemo.MailBeanTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.561 sec

Results :

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 4.771s
[INFO] Finished at: Mon Dec 19 12:15:58 JST 2011
[INFO] Final Memory: 14M/209M
[INFO] ------------------------------------------------------------------------
You have new mail in /var/spool/mail/nekop

最後の行に出力されていますが、きちんとメールが送信されたようです。

次にarq-jbossas-managedでテストしてみましょう。managedではインストールされているJBoss AS 7をArquillianが起動してテストするという形になるので、JBoss AS 7のインストールパスを環境変数JBOSS_HOMEに設定して渡す必要があります。

$ JBOSS_HOME=/home/nekop/jboss710b1b mvn -Parq-jbossas-managed test
(省略)
-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running jp.programmers.as7.mailsessiondemo.MailBeanTest
Dec 19, 2011 2:25:30 PM org.jboss.as.arquillian.container.managed.ManagedDeployableContainer startInternal
INFO: Starting container with: [java, -Xmx512m, -XX:MaxPermSize=128m, -Djboss.home.dir=/home/nekop/jboss710b1b, -Dorg.jboss.boot.log.file=/home/nekop/jboss710b1b/standalone/log/boot.log, -Dlogging.configuration=file:/home/nekop/jboss710b1b/standalone/configuration/logging.properties, -Djboss.modules.dir=/home/nekop/jboss710b1b/modules, -jar, /home/nekop/jboss710b1b/jboss-modules.jar, -mp, /home/nekop/jboss710b1b/modules, -logmodule, org.jboss.logmanager, -jaxpmodule, javax.xml.jaxp-provider, org.jboss.as.standalone, -server-config, standalone.xml]
(省略)
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 4.583 sec

Results :

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 7.568s
[INFO] Finished at: Mon Dec 19 14:25:35 JST 2011
[INFO] Final Memory: 13M/213M
[INFO] ------------------------------------------------------------------------
You have new mail in /var/spool/mail/nekop

Arquillianについては長くなりそうなので一旦日を分けます。また次回!