【问题标题】:Surefire able to run test, failsafe notSurefire 能够运行测试,故障保护不能
【发布时间】:2014-01-29 09:26:28
【问题描述】:

我有一些集成测试可以使用带有命令的 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;
    }
...

【问题讨论】:

  • 您使用的是哪个版本的 maven-surefire、maven-failsafe?你能展示完整的pom吗?
  • 对不起,版本来自父 pom。两个版本都是 2.12.4

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


【解决方案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

【讨论】:

    【解决方案2】:

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

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

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

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

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

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

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

    如果不成功,我会尝试

    修改这三个设置:forkCountuseSystemClassLoader、 和useManifestOnlyJar

    如文件所述。

    【讨论】:

      猜你喜欢
      • 2011-06-26
      • 1970-01-01
      • 1970-01-01
      • 2021-09-23
      • 2013-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-30
      相关资源
      最近更新 更多