Аркиллиан: Внедрилась дикая муха?

До сих пор мои интеграционные тесты выполнялись с Arquillian и встроенным Glassfish 4.x. Поскольку я страдаю от ошибки ARQ-1458, я попытался перейти на Wildfly 8.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 также есть примеры только для JBoss AS в качестве управляемых серверов, поэтому мне интересно, возможно ли это вообще (но почему тогда есть 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)

person Timo Böwing    schedule 03.01.2014    source источник
comment
У меня такое ощущение, что wildfly-embedded на самом деле не встроенный контейнер или еще не закончен. Потому что я немного покопался и посмотрел на Java-класс EmbeddedContainerConfiguration. Там они явно проверяют jbossHome, moduleHome и bundleHome. Поэтому вам нужно скачать настоящий wildfly, который, на мой взгляд, не является встроенным контейнером ;) В настоящее время вместо этого я использую управляемый / удаленный адаптер, и все работает нормально. Для встроенных тестов я буду использовать Glassfish-embedded :)   -  person zip    schedule 22.01.2014
comment
Да, видел тот же код :( Так что я боюсь, что мне придется пойти на тот же вариант и ждать лису ARQ-1458. Я не сдаюсь, потому что использование встроенного Wildfly было бы моим первым вариантом, так что один может проверить проект и выполнить сборку Maven без необходимости многократной установки или использования другой помощи плагинов или задач ANT.   -  person Timo Böwing    schedule 22.01.2014
comment
Я знаю, что эта ветка довольно старая, но я был бы признателен, если бы кто-нибудь сообщил мне, что вы, люди, наконец, пришли к выводу об этой ошибке?   -  person Siddharth    schedule 19.03.2015


Ответы (4)


В переменной окружения 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>

from example application jboss-javaee6-webapp

person javaeeeee    schedule 12.09.2014

использовать 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>

person eriskooo    schedule 26.02.2015

Посмотрите на эту замечательную статью, написанную Дэном Аллен.

Короче говоря: обычно не используйте встроенный контейнер (особенно стеклянную рыбу с EclipseLink). Автономный сервер дает нам более точные результаты тестирования.

Также я предпочитаю удаленные адаптеры из-за скорости разработки (никакого запуска сервера при каждом тестовом запуске, просто запускайте его вручную один раз). Если вы хотите, чтобы контейнер запускался автоматически, как в случае встроенного, переключитесь на управляемый контейнер.

Надеюсь, поможет.

person G. Demecki    schedule 18.09.2014
comment
Здравствуйте, Grzesiek, большое спасибо за эту информативную и важную ссылку. Я думаю, что я перейду на удаленный контейнер таким образом, тем более, что плетение для меня важная вещь. Первоначальная (и все еще актуальная в какой-то момент) идея заключалась в том, что кто-то может просто загрузить проект Maven и просто запустить модульные/интеграционные тесты без установки контейнера. Еще раз большое спасибо! - person Timo Böwing; 19.09.2014
comment
@TimoBoewing Добро пожаловать:] Я хорошо вас понимаю, потому что когда-то я тоже был в ловушке этой заманчивой идеи. - person G. Demecki; 19.09.2014

Ну, я предполагаю, что с Wildfly это работает иначе, чем с Glassfish:

https://community.jboss.org/thread/236562

:(

Изменить: Docker предлагает другой взгляд на эту проблему. Я мог легко управлять внешним контейнером с помощью Docker и Maven, продолжая использовать Arquillian. Еще не проверял, но если кто наткнется...

person Timo Böwing    schedule 22.02.2014
comment
Это правда, но лично я предпочел бы удаленный (или управляемый) адаптер, так как он дает нам более точные результаты тестирования (и меньше проблем). - person G. Demecki; 18.09.2014