分速で始める JavaEE 7 〜 Arquillian 〜

f:id:Naotsugu:20150213230909p:plain

前回の続き

blog1.mammb.com

arquillian のテストまでやっときます。

ファイル準備

テスト用のパッケージ追加と arquillian 用の設定ファイルなどを作成しておきます。

mkdir -p src/test/java/example/service
mkdir -p src/test/resources/META-INF

touch src/test/java/example/service/MemberRegistrationTest.java
touch src/test/resources/META-INF/test-persistence.xml
touch src/test/resources/arquillian.xml
touch src/test/resources/test-ds.xml

test-ds.xml

テスト用のデータソース設定です。

<?xml version="1.0" encoding="UTF-8"?>
<datasources xmlns="http://www.jboss.org/ironjacamar/schema"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://www.jboss.org/ironjacamar/schema http://docs.jboss.org/ironjacamar/schema/datasources_1_0.xsd">
    <datasource jndi-name="java:jboss/datasources/SampleTestDS"
                pool-name="sample-test" enabled="true"
                use-java-context="true">
        <connection-url>jdbc:h2:mem:sample-test;DB_CLOSE_DELAY=-1</connection-url>
        <driver>h2</driver>
        <security>
            <user-name>sa</user-name>
            <password>sa</password>
        </security>
    </datasource>
</datasources>

SampleTestDS という名前でデータソース定義しました。

test-persistence.xml

テスト用の永続化設定です。

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1"
             xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="
        http://xmlns.jcp.org/xml/ns/persistence
        http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">

    <persistence-unit name="primary">
        <jta-data-source>java:jboss/datasources/SampleTestDS</jta-data-source>
        <properties>
            <property name="hibernate.hbm2ddl.auto" value="create-drop" />
            <property name="hibernate.show_sql" value="false" />
        </properties>
    </persistence-unit>
</persistence>

先ほどの ExampleTestDS というデータソースを指定して永続化設定を行いました。

arquillian.xml

arquillian の設定です。

<?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">

    <defaultProtocol type="Servlet 3.0" />
    <container qualifier="jboss" default="true">
        <configuration>
            <property name="jbossHome">wildfly/wildfly-8.2.0.Final/wildfly-8.2.0.Final</property>            
            <property name="serverConfig">standalone-full.xml</property>
        </configuration>
    </container>

</arquillian>

jbossHome の設定が必要なため、configuration 要素にプロパティで指定しています。 JavaEE のフルプロファイルを使うため、明示的に standalone-full.xml を指定します。

設定ファイルはこれで終了です。

MemberRegistrationTest.java

テストコードを作成します。今回は MemberRegistration のテストを Java EE コンテナ上で行います。

package example.service;

import static org.junit.Assert.assertNotNull;

import javax.inject.Inject;

import example.model.Member;
import example.Resources;
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.WebArchive;

import org.junit.Test;
import org.junit.runner.RunWith;

@RunWith(Arquillian.class)
public class MemberRegistrationTest {
    
    @Deployment
    public static Archive<?> createTestArchive() {
        return ShrinkWrap.create(WebArchive.class, "test.war")
                .addClasses(Member.class, MemberRegistration.class, Resources.class)
                .addAsResource("META-INF/test-persistence.xml", "META-INF/persistence.xml")
                .addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml")
                .addAsWebInfResource("test-ds.xml");
    }
    
    @Inject
    MemberRegistration memberRegistration;


    @Test
    public void testRegister() throws Exception {
        Member newMember = new Member();
        newMember.setName("Jane Doe");
        newMember.setEmail("jane@mailinator.com");
        memberRegistration.register(newMember);
        assertNotNull(newMember.getId());
    }
}

@RunWith(Arquillian.class) にて Arquillian でテストするようにします。

ShrinkWrap にて War を作成します。先ほど作成した設定ファイルをリソースとして加えます。

後は @Inject にて CDI で MemberRegistration が使えるので、永続化を行うテストを書きます。

build.gradle

下部 3 つの依存を追加します。

dependencies {
    providedCompile 'org.jboss.spec:jboss-javaee-all-7.0:1.0.2.Final'
    
    testCompile 'junit:junit:4.11'
    
    testCompile 'org.jboss.arquillian.junit:arquillian-junit-container:1.1.7.Final'
    testCompile 'org.jboss.arquillian.protocol:arquillian-protocol-servlet:1.1.7.Final'
    testCompile 'org.wildfly:wildfly-arquillian-container-managed:8.2.0.Final'
}

さらにリポジトリの定義も追加します。

repositories { 
    mavenCentral()
    maven { url "https://repository.jboss.org/nexus/content/groups/public/" }
}

実行

テストを実行します。

./gradlew test

wildfly が起動してテストが走ります。

テスト結果を確認してみます。

file:///<PATH-TO-PROJECT-DIR>/example/build/reports/tests/index.html

グリーンとなっていることが確認できますね。

f:id:Naotsugu:20150216224804p:plain