Arquillianを使ってみよう!

JBossでテストをする場合は、Arquillianというテスト用プラットフォームを使うと便利です。これが、どういったものなのか理解するためには、Getting Started · Arquillian Guidesを、ざっくりと読んでみると良いでしょう。手元で確認をしてみたので、英語が苦手、ざっくりとどんな手順か知りたい、という人のためにメモを公開しておきます。

arquillianを使うためには、まずはJBoss Forgeを使うのが手っ取り早いようですが、ここでは、Java使いなら大体インストール済みとなっているであろうApache Mavenを使ってみました。

$ mvn archetype:generate  \
  -DarchetypeGroupId=net.avh4.mvn.archetype \
  -DarchetypeArtifactId=java-1.6-archetype

いくつか値を入力する必要があるので、次のように指定します。

Define value for property 'groupId': : org.arquillian.example
Define value for property 'artifactId': : arquillian-tutorial
Define value for property 'version': :
Define value for property 'package': :
Confirm properties configuration:
groupId: org.arquillian.example
artifactId: arquillian-tutorial
version: 1.0-SNAPSHOT
package: org.arquillian.example
Y: :Y

こうすると、Mavenでコンパイルできる、Arquillianを使った雛形プロジェクトが生成されます。

./arquillian-tutorial/pom.xml
./arquillian-tutorial/src
./arquillian-tutorial/src/main/java/org/arquillian/example
./arquillian-tutorial/src/main/resources/org/arquillian/example
./arquillian-tutorial/src/test
./arquillian-tutorial/src/test/java/org/arquillian/example
./arquillian-tutorial/src/test/resources/org/arquillian/example
./arquillian-tutorial/target

Java6, JUnit4.8 を使いますが、最低限のバージョンだというだけで、Java7などでも動きます。また、Arquillianは、TestNG 5もサポートしています。

生成された pom.xml について編集して、次のようにします。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
        http://maven.apache.org/POM/4.0.0
        http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.arquillian.example</groupId>
    <artifactId>arquillian-tutorial</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>arquillian-tutorial</name>
    <url>http://arquillian.org</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.3.2</version>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.8.1</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

JUnitのdependencyの下に、次のorg.jboss.spec:jboss-javaee-6.0を挿入します。javax:javaee-api を使わないように気をつけてください。

    <dependency>
        <groupId>org.jboss.spec</groupId>
        <artifactId>jboss-javaee-6.0</artifactId>
        <version>1.0.0.Final</version>
        <type>pom</type>
        <scope>provided</scope>
    </dependency>

pom.xmlをEclipseへインポートします。m2e pluginか、JBoss Toolsをインストールしておく必要があります。Mavenの既存プロジェクトをインポートすると、Eclipseでこのプロジェクトを編集したり、テスト実行をしたりすることができるようになります。用意ができたら、さっそくテストを動かしてみましょう。

まずは、テストの対象とするorg.arquillian.example.Greeterクラスを作成します。

package org.arquillian.example;
import java.io.PrintStream;
public class Greeter {
    public void greet(PrintStream to, String name) {
        to.println(createGreeting(name));
    }
    public String createGreeting(String name) {
        return "Hello, " + name + "!";
    }
}

次に、pom.xmlを開いて、build要素の前に下記を追加します。

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.jboss.arquillian</groupId>
            <artifactId>arquillian-bom</artifactId>
            <version>1.0.1.Final</version>
            <scope>import</scope>
            <type>pom</type>
        </dependency>
    </dependencies>
</dependencyManagement>

また、project要素直下のdependencies要素にあるjunitのdependencyの下に、下記を追加します。arquillian-junit-containerはArquillian用JUnitコンテナ、arquillian-weld-ee-embedded-1.1とweld-coreはArquillian用JavaEE用コンテナ、org.slf4jはログ用のものです。

<dependency>
    <groupId>org.jboss.arquillian.junit</groupId>
    <artifactId>arquillian-junit-container</artifactId>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.jboss.arquillian.container</groupId>
    <artifactId>arquillian-weld-ee-embedded-1.1</artifactId>
    <version>1.0.0.CR3</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.jboss.weld</groupId>
    <artifactId>weld-core</artifactId>
    <version>1.1.5.Final</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-simple</artifactId>
    <version>1.6.4</version>
    <scope>test</scope>
</dependency>

オプションにあるplugins要素に下記を追加しておくと良いでしょう。

<plugin>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.12</version>
</plugin>

Arquillianを利用するテストクラスは次のようになります。アノテーションに注目してください。

  • @RunWith(Arquillian.class)をクラスにつけている
  • @DeploymentをShrinkWrap archiveを返すpublic staticメソッドにつけている
  • @Testをテストメソッドにつけている(最低1つのテストメソッドが必要)
package org.arquillian.example;

import javax.inject.Inject;
import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.junit.Arquillian;
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.Assert;
import org.junit.runner.RunWith;

@RunWith(Arquillian.class)
public class GreeterTest {

    @Deployment
    public static JavaArchive createDeployment() {
        return ShrinkWrap.create(JavaArchive.class)
            .addClass(Greeter.class)
            .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
    }

    @Inject
    Greeter greeter;

    @Test
    public void should_create_greeting() {
        Assert.assertEquals("Hello, Earthling!",
            greeter.createGreeting("Earthling"));
        greeter.greet(System.out, "Earthling");
    }
}

ShrinkWrap archiveはテストで使うクラスをJARにして利用するから指定しておく必要があるようです。このメソッドでGreeter.classを指定しています。

次のようにすると、コンソールへJARの中身を出力できるので、興味がある人は確認してみると良いでしょう。

    JavaArchive jar = ShrinkWrap.create(JavaArchive.class)
        .addClass(Greeter.class)
        .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
    System.out.println(jar.toString(true));
    return jar;

また、「@Inject Greeter greeter;」として、greeterをインジェクトしています。org.junit.Assertを使って、greeterの処理についてテストをしています。

以上で、EclipseでJUnitテストが動くようになります。コンソールで、mvn testとしても実行できるようになっているはずです。参考までに、ここまで読んで実際に動かしてみると、pom.xml は次のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="
      http://maven.apache.org/POM/4.0.0
      http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>org.arquillian.example</groupId>
  <artifactId>arquillian-tutorial</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>arquillian-tutorial</name>
  <url>http://arquillian.org</url>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
  <dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.jboss.arquillian</groupId>
            <artifactId>arquillian-bom</artifactId>
            <version>1.0.1.Final</version>
            <scope>import</scope>
            <type>pom</type>
        </dependency>
    </dependencies>
  </dependencyManagement>
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>2.3.2</version>
        <configuration>
          <source>1.6</source>
          <target>1.6</target>
        </configuration>
      </plugin>
      <plugin>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.12</version>
      </plugin>
    </plugins>
  </build>
  <dependencies>
    <dependency>
      <groupId>org.jboss.spec</groupId>
      <artifactId>jboss-javaee-6.0</artifactId>
      <version>1.0.0.Final</version>
      <type>pom</type>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.8.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.jboss.arquillian.junit</groupId>
      <artifactId>arquillian-junit-container</artifactId>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.jboss.arquillian.container</groupId>
      <artifactId>arquillian-weld-ee-embedded-1.1</artifactId>
      <version>1.0.0.CR3</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.jboss.weld</groupId>
      <artifactId>weld-core</artifactId>
      <version>1.1.5.Final</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-simple</artifactId>
      <version>1.6.4</version>
      <scope>test</scope>
    </dependency>    
  </dependencies>
</project>

本家サイト「Getting Started · Arquillian Guides」では、この他にPhraseBuilderクラスを追加してテストをする例や、Java EE コンテナを切り替えることが出来るようにする方法も紹介されています。興味があったら読んでみると良いでしょう。

同じタグの記事: Arquillian
同じタグの記事: Java
同じタグの記事: JBoss
同じカテゴリの記事: Java
関連書籍: Java
関連書籍: JBoss