我有一些使用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;
}
...
答案 0 :(得分:1)
我不确定这里发生了什么,但有一个关于类加载问题的完整文档页面可能与您的问题有关。
https://maven.apache.org/surefire/maven-failsafe-plugin/examples/class-loading.html
此页面解释说,在使用参数forkMode=never
(显然已弃用)时,插件必须使用隔离的类加载器。
这里解释了具有隔离类加载器的一个限制:
例如,系统属性
java.class.path
将不包含您的 罐子;如果您的应用注意到这一点,则可能会导致问题
我同意在这种情况下有点深奥,但我不能不认为它与你的问题有关。
您是否尝试更改当前配置?我不知道,可能会删除forkMode
和threadCount
并查看默认配置如何处理所有这些?
如果它不起作用,我会尝试
修补这三项设置:
forkCount
,useSystemClassLoader
, 和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。