Arquillian: Wildfly встроенный?
До сих пор я проводил свои интеграционные тесты с Arquillian и встроенным Glassfish 4.x. поскольку я страдаю от ошибки ARQ-1458, я попытался перейти на Wildfly 8.0.0.Бета1.
Мои депы в 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 также есть только примеры для JBoss как управляемых серверов, поэтому я удивляюсь, что это вообще возможно (но почему тогда WildFly-arquillian-container-embedded?)?
Или мне следует придерживаться управляемого контейнера с помощью плагина Maven-dependency-plugin для загрузки контейнера (см. http://arquillian.org/guides/getting_started/#add_more_containers - снизу)?
Спасибо и всего наилучшего с уважением!
Точная Ошибка:
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)
4 ответов:
Необходимо установить переменную окружения JBOSS_HOME в значение path to JBoss installation. В противном случае в arquillian следует добавить свойство tag .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>
Посмотрите наЭту замечательную статью , написанную Дэном Алленом.
Короче говоря: обычно не используйте встроенный контейнер (glassfish с EclipseLink в частности). Автономный сервер дает нам более точные результаты тестирования.
Также я предпочитаю удаленные адаптеры из-заскорости разработки (нет запуска сервера при каждом тестовом запуске, просто запустите его вручную один раз). Если вы хотите, чтобы контейнер запускался автоматически, как с embedded, то переключитесь на управляемый контейнер.
Надеюсь, это поможет.
Ну, я думаю, что это работает по-другому с Wildfly, чем с Glassfish:
Https://community.jboss.org/thread/236562
:(
Edit: Docker добавляет еще один взгляд на этот вопрос. Я мог легко управлять внешним контейнером с помощью Докера и Мэйвена, все еще используя Арквиллиан. Пока не проверял, но если кто-то наткнется на это...
Comments