これまで、Arquillianと組み込みのGlassfish4.xを使用して統合テストを実行していました。バグ ARQ-1458 に悩まされているので、Wildfly8.0.0.Beta1に移行してみました。
Mavenの私の担当者は次のとおりです。
<dependency>
<groupId>org.jboss.arquillian</groupId>
<artifactId>arquillian-bom</artifactId>
<version>1.1.2.Final</version>
<scope>import</scope>
<type>pom</type>
</dependency>
<dependency>
<groupId>org.jboss.arquillian.junit</groupId>
<artifactId>arquillian-junit-container</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.wildfly</groupId>
<artifactId>wildfly-arquillian-container-embedded</artifactId>
<version>8.0.0.Beta1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.wildfly</groupId>
<artifactId>wildfly-embedded</artifactId>
<version>8.0.0.Beta1</version>
<scope>test</scope>
</dependency>
テストを実行すると、jbossHomeがnullであるというエラーが表示されます。 arquillian.xmlはありません。 Githubソースでwildfly-arquillian-container-embedded(POM)を確認するとき、埋め込みコンテナーにJBOSS_HOMEが必要なのはなぜですか?マネージドバリアントとリモートバリアントで使用できることは理解していますが、組み込みバリアントで必要なのはなぜですか? Arquillianページにも管理対象サーバーとしてのJBossASの例しかないので、それはまったく可能だと思います(しかし、なぜwildfly-arquillian-container-embeddedがあるのですか?)?
または、maven-dependency-pluginを使用してコンテナーをダウンロードすることで管理対象コンテナーに固執する必要があります( http://arquillian.org/guides/getting_started/#add_more_containers --bottomを参照)?
よろしくお願いします!
正確なエラーは次のとおりです。
org.jboss.arquillian.container.spi.ConfigurationException: jbossHome 'null' must exist
at org.jboss.arquillian.container.spi.client.deployment.Validate.configurationDirectoryExists(Validate.Java:139)
at org.jboss.as.arquillian.container.embedded.EmbeddedContainerConfiguration.validate(EmbeddedContainerConfiguration.Java:102)
at org.jboss.arquillian.container.impl.ContainerImpl.createDeployableConfiguration(ContainerImpl.Java:115)
at org.jboss.arquillian.container.impl.ContainerImpl.setup(ContainerImpl.Java:181)
at org.jboss.arquillian.container.impl.client.container.ContainerLifecycleController$7.perform(ContainerLifecycleController.Java:149)
at org.jboss.arquillian.container.impl.client.container.ContainerLifecycleController$7.perform(ContainerLifecycleController.Java:145)
at org.jboss.arquillian.container.impl.client.container.ContainerLifecycleController.forContainer(ContainerLifecycleController.Java:255)
at org.jboss.arquillian.container.impl.client.container.ContainerLifecycleController.setupContainer(ContainerLifecycleController.Java:144)
at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:57)
at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
at Java.lang.reflect.Method.invoke(Method.Java:606)
at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.Java:94)
at org.jboss.arquillian.core.impl.EventContextImpl.invokeObservers(EventContextImpl.Java:99)
at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.Java:81)
at org.jboss.arquillian.container.impl.client.ContainerDeploymentContextHandler.createContainerContext(ContainerDeploymentContextHandler.Java:57)
at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:57)
at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
at Java.lang.reflect.Method.invoke(Method.Java:606)
at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.Java:94)
at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.Java:88)
at org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.Java:135)
at org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.Java:115)
at org.jboss.arquillian.core.impl.EventImpl.fire(EventImpl.Java:67)
at org.jboss.arquillian.container.impl.client.container.ContainerLifecycleController$1.perform(ContainerLifecycleController.Java:62)
at org.jboss.arquillian.container.impl.client.container.ContainerLifecycleController$1.perform(ContainerLifecycleController.Java:55)
at org.jboss.arquillian.container.impl.client.container.ContainerLifecycleController.forEachContainer(ContainerLifecycleController.Java:209)
at org.jboss.arquillian.container.impl.client.container.ContainerLifecycleController.setupContainers(ContainerLifecycleController.Java:54)
at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:57)
at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
at Java.lang.reflect.Method.invoke(Method.Java:606)
at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.Java:94)
at org.jboss.arquillian.core.impl.EventContextImpl.invokeObservers(EventContextImpl.Java:99)
at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.Java:81)
at org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.Java:135)
at org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.Java:115)
そうですね、WildflyとGlassfishでは動作が異なると思います。
https://community.jboss.org/thread/236562
:(
編集: Docker この問題に関する別の視点を追加します。 Arquillianを使用しながら、DockerとMavenを使用して外部コンテナーを簡単に管理できました。まだテストしていませんが、誰かがこれに遭遇した場合...
環境変数JBOSS_HOMEをjBossインストールへのパスに設定する必要があります。それ以外の場合は、タグpropertyをコンテナタグ内のarquillian.xmlに追加する必要があります。
<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="jboss" default="true">
<configuration>
<property name="jbossHome">/path/to/jboss/as</property>
</configuration>
</container>
サンプルアプリケーションからjboss-javaee6-webapp
systemPropertyVariablesを使用する
<profile>
<id>INTEGRATION_TESTS</id>
<dependencies>
<dependency>
<groupId>org.wildfly</groupId>
<artifactId>wildfly-arquillian-container-embedded</artifactId>
<version>8.2.0.Final</version>
</dependency>
<!-- this is the wildfly emb.container - BUT eventually it is not a fully blown emb.container-->
<dependency>
<groupId>org.wildfly</groupId>
<artifactId>wildfly-embedded</artifactId>
<version>8.2.0.Final</version>
</dependency>
<dependency>
<groupId>com.Oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.3</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>unpack</id>
<phase>process-test-classes</phase>
<goals>
<goal>unpack</goal>
</goals>
<configuration>
<artifactItems>
<artifactItem>
<groupId>org.wildfly</groupId>
<artifactId>wildfly-dist</artifactId>
<version>8.2.0.Final</version>
<type>Zip</type>
<overWrite>false</overWrite>
<outputDirectory>target</outputDirectory>
</artifactItem>
</artifactItems>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.wildfly.plugins</groupId>
<artifactId>wildfly-maven-plugin</artifactId>
<version>1.0.2.Final</version>
<executions>
<execution>
<phase>prepare-package</phase>
<goals>
<goal>start</goal>
</goals>
</execution>
<execution>
<id>jdbc</id>
<phase>package</phase>
<goals>
<goal>deploy-artifact</goal>
</goals>
<configuration>
<groupId>com.Oracle</groupId>
<artifactId>ojdbc6</artifactId>
<name>ojdbc6.jar</name>
</configuration>
</execution>
<execution>
<id>datasource</id>
<phase>package</phase>
<goals>
<goal>add-resource</goal>
</goals>
<configuration>
<address>subsystem=datasources,data-source=tests</address>
<resources>
<resource>
<properties>
<connection-url>jdbc:Oracle:thin:@***:1521:xe</connection-url>
<jndi-name>Java:jboss/datasources/tests</jndi-name>
<enabled>true</enabled>
<enable>true</enable>
<user-name>***</user-name>
<password>***</password>
<driver-name>ojdbc6.jar</driver-name>
<use-ccm>false</use-ccm>
</properties>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<version>2.17</version>
<configuration>
<systemPropertyVariables>
<Java.util.logging.manager>org.jboss.logmanager.LogManager</Java.util.logging.manager>
<jboss.home>${project.basedir}/target/wildfly-8.2.0.Final</jboss.home>
<module.path>${project.basedir}/target/wildfly-8.2.0.Final/modules</module.path>
</systemPropertyVariables>
</configuration>
<executions>
<execution>
<id>integration-test</id>
<goals>
<goal>integration-test</goal>
</goals>
</execution>
<execution>
<id>verify</id>
<goals>
<goal>verify</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
この素敵な記事 ダンアレンによって書かれたを見てください。
簡単に言うと、通常、埋め込みコンテナ(特にEclipseLinkを備えたGlassfish)は使用しないでください。スタンドアロンサーバーは、より正確なテスト結果を提供します。
また、開発速度のためにリモートアダプターを好みます(テストを起動するたびにサーバーを起動することはなく、手動で1回起動するだけです)。埋め込みのようにコンテナを自動的に起動する場合は、管理コンテナに切り替えます。
それが役に立てば幸い。