JBoss AS 7.1.3 + JBoss Forge 1.2.0 を使ってみよう

小山博史のJavaを楽しむ(17):JBoss Forgeでアジャイルな対話式開発をやってみた (1/4) – @IT」について、JBoss AS 7.1.1 + JBoss Forge 1.1.2 を使っていますが、今は JBoss AS 7.1.3 + Forge 1.2.0 が最新です。基本的には記事で紹介していることと同じことができますが、最新版だとそのままでは Arquillienが動作しません。なお、JBoss 7.1.3のバイナリ入手方法については「JBoss AS 7.1.3 のバイナリ jboss-as-7.1.3.Final.zip の入手方法 | hiro345」をご覧ください。

手元で確認したところでは、「Caused by: java.lang.ClassNotFoundException: org.jboss.as.osgi.deployment.OSGiDeploymentAttachment」といったエラーが表示されてテストが失敗します。調べてみたところ、「java.lang.ClassNotFoundException: org.jboss.as.osgi.deployment.OSGiDeploymentAttachment from [Module "deployment.arquillian-service:main" from Service Module Loader] | Arquillian | JBoss Community」のページに同じ現象についての質問があり、「Why do I get "No active contexts for scope type" when testing on JBoss AS 7 | Arquillian | JBoss Community」に解答がありました。

src/test/resources/arquillian.xml は次のようにconfiguration要素のproperty要素としてjbossHomeを追加するだけでなく、protocol要素も追加します。

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<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">
    <container qualifier="jbossas-managed" default="true">
        <protocol type="Servlet 3.0"/>
        <configuration>
            <property name="jbossHome">/home/user001/applications/java/jboss</property>
        </configuration>
    </container>
</arquillian>

UserInfoDaoTest.java は次のように修正をします。クラスのパッケージ名は記事とはちょっと違っているかもしれません。作成したものに合わせてください。

package jp.example.simpleapp.model.dao;
import jp.example.simpleapp.model.dao.UserInfoDao;
import jp.example.simpleapp.model.UserInfo; // 追加
import javax.inject.Inject;
import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.container.test.api.OverProtocol; // 追加
import org.jboss.arquillian.junit.Arquillian;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.spec.JavaArchive;
import org.jboss.shrinkwrap.api.asset.EmptyAsset;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import static org.junit.Assert.*;
import static org.hamcrest.core.Is.*;
@RunWith(Arquillian.class)
public class UserInfoDaoTest {
   @Inject
   private UserInfoDao userinfodao;
   @Deployment
   @OverProtocol("Servlet 3.0") // 追加
   public static JavaArchive createDeployment() {
      return ShrinkWrap.create(JavaArchive.class, "test.jar").
          addClass(UserInfo.class).
          addClass(UserInfoDao.class).
          addAsManifestResource("META-INF/persistence.xml", "persistence.xml").addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
   }
   @Test
   public void testIsDeployed() {
      Assert.assertNotNull(userinfodao);
   }
   // 下記を追加
   @Test
   public void testListUserInfo() {
      Assert.assertEquals(3, userinfodao.listUserInfo().size());
   }
}

pom.xml は次のように修正をして、JBOSS_AS_MANAGED_7.X の profile へ org.jboss.arquillian.protocol を追加します。

<?xml version="1.0" encoding="UTF-8"?>
<!-- 略 -->
  <profiles>
    <profile>
      <id>JBOSS_AS_MANAGED_7.X</id>
      <dependencies>
        <dependency>
          <groupId>org.jboss.as</groupId>
          <artifactId>jboss-as-arquillian-container-managed</artifactId>
          <version>7.1.3.Final</version>
        </dependency>
        <dependency>
          <groupId>org.jboss.arquillian.protocol</groupId>
          <artifactId>arquillian-protocol-servlet</artifactId>
          <scope>test</scope>
        </dependency>
      </dependencies>
    </profile>
  </profiles>
</project>

以上で、JBoss AS 7.1.3 でもテストができるようになります。

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