我正在使用Java9模块系统(在openjdk11上运行)
我有
此类的单元测试,尝试加载两个测试服务实现
META-INF / services文件中列出了测试实现
src/main/example/Service.java
public interface Service {
public static List<Service> loadServices(){
return StreamSupport.stream(ServiceLoader.load(Service.class).spliterator(),false)
.collect(Collectors.toList());
}
}
和一个
src/main/module-info.java
module example {
uses example.Service;
exports example;
}
我有这样的单元测试
src/main/example/ServiceTest.java
public ServiceTest {
@Test
void loadServices_should_find_TestServices{
List<Service> services = Service.loadServices();
assertEquals(2, services.size());
}
}
我在测试源中有两个测试服务:
src/main/example/TestService1.java
public TestService1 implements Service {}
src/main/example/TestService2.java
public TestService2 implements Service {}
src/test/resources/META-INF/services/example.Service
example.TestService1
example.TestService2
我正在使用没有任何特定配置的maven-surefire-plugin 3.0.0-M3
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<version>3.0.0-M3</version>
</plugin>
可以正确修补示例模块(来自surefireargs文件)
--patch-module example="D:\\git\\example\\target\\test-classes"
当我直接在IntelliJ中执行测试时,该测试成功运行,找到了两个服务。 但是,当我在maven中构建模块并通过surefire执行测试时,它找不到服务,并且测试失败。
我应该如何配置surefire以找到位于测试源中的TestServices?我无法在模块信息中定义“ provides ...”声明,因为它们是测试服务。我究竟做错了什么?
答案 0 :(得分:1)
我找到了一种解决方法,我并未真正考虑该问题的实际解决方案: 在surefire中禁用ModulePath,恢复为ClassPath:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<useModulePath>false</useModulePath>
</configuration>
</plugin>