1

我有一些使用带有命令的surefire插件完美运行的集成测试:

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

当我使用故障安全插件运行相同的集成测试时

mvn verify

测试失败,表明它缺少依赖项(jackson lib,“No Message body writer found for response class”)。

所需的依赖项被添加到带有范围测试的 pom 中。surefire 和 failsafe 执行测试的方式有什么区别?

更多上下文:我的 pom 包含以下内容:

...
<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;
    }
...
4

2 回答 2

1

我不太确定这里发生了什么,但有一个关于类加载问题的完整文档页面,可能与您的问题有关。

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

该页面解释说,在使用参数forkMode=never(显然已弃用)时,插件必须使用隔离的类加载器。

此处解释了具有隔离类加载器的限制之一:

例如,系统属性java.class.path不会包含您的 jar;如果您的应用注意到这一点,则可能会导致问题

我同意在这种情况下它有点深奥,但我不能停止认为它与您的问题有关。

您是否尝试更改您拥有的当前配置?我不知道,也许放弃forkModeandthreadCount看看默认配置是如何处理这一切的?

如果它不起作用,我会尝试

修改这三个设置:forkCountuseSystemClassLoaderuseManifestOnlyJar

正如文件所说。

于 2014-02-04T10:47:23.647 回答
1

问题可能是因为用作 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 插件时,所需的类将可用。

此处描述了类似的集成测试设置。

于 2014-02-06T07:29:04.817 回答