Surefire能够运行测试,故障安全没有

时间:2014-01-29 09:26:29

标签: maven integration-testing maven-surefire-plugin maven-failsafe-plugin

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

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

当我使用

运行与failsafe插件相同的集成测试时
mvn verify

测试失败,表明它缺少依赖项(jackson lib,“没有为响应类找到消息正文编写器”)。

通过范围测试将所需的依赖项添加到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;
    }
...

2 个答案:

答案 0 :(得分:1)

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

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

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

这里解释了具有隔离类加载器的一个限制:

  

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

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

您是否尝试更改当前配置?我不知道,可能会删除forkModethreadCount并查看默认配置如何处理所有这些?

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

  

修补这三项设置:forkCountuseSystemClassLoader,   和useManifestOnlyJar

正如文件所说。

答案 1 :(得分: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插件时,所需的类将可用。

描述了类似的集成测试设置here