Surefire может запустить тест, отказоустойчивый - нет

У меня есть несколько интеграционных тестов, которые отлично работают с помощью плагина surefire с командой:

mvn -Dtest=path.to.test.classIT surefire:test

Когда я запускаю тот же интеграционный тест с отказоустойчивым плагином, используя

mvn verify

тест завершается неудачно, указывая на отсутствие зависимости (библиотека jackson, «Для класса ответа не найдено средство записи тела сообщения»).

Необходимая зависимость добавляется в pom with scope test. В чем разница в том, как surefire и failsafe выполняют тесты?

Еще немного контекста: мой помпон содержит следующее:

...
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-failsafe-plugin</artifactId>
    <version>2.12.4</version>
    <configuration>
        <forkMode>never</forkMode>
        <threadCount>1</threadCount>
    </configuration>
</plugin>
...
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.10</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.mockito</groupId>
        <artifactId>mockito-core</artifactId>
        <version>1.9.0</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.openejb</groupId>
        <artifactId>openejb-cxf-rs</artifactId>
        <version>4.6.0</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.openejb</groupId>
        <artifactId>openejb-mockito</artifactId>
        <version>4.6.0</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.jaxrs</groupId>
        <artifactId>jackson-jaxrs-json-provider</artifactId>
        <version>2.2.3</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-web-api</artifactId>
        <scope>provided</scope>
    </dependency>

В тестовом классе используется applicationcomposer

@RunWith(ApplicationComposer.class)
public class PdaServiceIT {

    ....
    @Configuration
    public Properties config() throws Exception {

        Properties properties = new Properties();

        properties.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.openejb.client.RemoteInitialContextFactory");
        properties.setProperty(OpenEjbContainer.OPENEJB_EMBEDDED_REMOTABLE, "true");
        properties.setProperty("cxf.jaxrs.providers", "com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider");

        return properties;
    }
...

person Runar Halse    schedule 29.01.2014    source источник
comment
Какие версии maven-surefire, maven-failsafe вы используете? Можешь показать полный помпон?   -  person khmarbaise    schedule 29.01.2014
comment
извините за это, версия исходит от родительского pom. Обе версии 2.12.4   -  person Runar Halse    schedule 29.01.2014


Ответы (2)


Проблема может быть вызвана тем, что класс, используемый в качестве поставщика Json, не находится в пути к классам. Это можно решить, добавив в интеграционный тест модуль, содержащий класс:

...
@RunWith(ApplicationComposer.class)
public class PdaServiceIT {

    ...
    @Configuration
    public Properties config() throws Exception {

        Properties properties = new Properties();

        properties.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.openejb.client.RemoteInitialContextFactory");
        properties.setProperty(OpenEjbContainer.OPENEJB_EMBEDDED_REMOTABLE, "true");
        properties.setProperty("cxf.jaxrs.providers", "com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider");

        return properties;
    }

    @Module
    public static Class<?>[] myJaxbProviders() {
        return new Class<?>[] { com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider.class };
    }
    ...
}

Тогда требуемый класс будет доступен при использовании как плагинов maven-surefire, так и maven-failsafe.

Аналогичная настройка интеграционного теста описана здесь.

person Daniel Rodriguez Fernandez    schedule 06.02.2014

Я не совсем уверен в том, что здесь происходит, но есть полная страница документации о проблемах с загрузкой классов, которые могут быть связаны с вашей проблемой.

https://maven.apache.org/surefire/maven-failsafe-plugin/examples/class-loading.html

На этой странице объясняется, что при использовании параметра forkMode=never (который, по-видимому, устарел) плагин должен использовать изолированный загрузчик классов.

Здесь объясняется одно из ограничений наличия изолированного загрузчика классов:

Например, системное свойство java.class.path не будет включать ваши банки; если ваше приложение заметит это, это может вызвать проблему

Я согласен, что в данном случае это немного эзотерично, но я не могу перестать думать, что это связано с вашей проблемой.

Вы пытались изменить текущую конфигурацию, которая у вас есть? Я не знаю, может быть, отбросить forkMode и threadCount и посмотреть, как конфигурация по умолчанию справляется со всем этим?

Если не получится, попробую

повозитесь с этими тремя настройками: forkCount, useSystemClassLoader и useManifestOnlyJar.

Как говорится в документе.

person Aurélien Thieriot    schedule 04.02.2014