这是我的基本模块,需要myspi包中定义的接口的实现。各种提供程序都可以提供MyProvider实现。基本模块通过myspi.MyProvider接口实现使用它们。
module base {
exports myspi;
uses myspi.MyProvider;
}
这是我的示例实现模块,它为MyProvider实现提供MyProviderImpl
module myspi.provider {
provides myspi.MyProvider with myspi.provider.MyProviderImpl;
}
当我在基本模块中加载实现时,所有这些都可以正常工作
public static List<MyProvider> getMyProviders() {
var myProviders = new ArrayList<MyProvider>();
for (MyProvider myProvider : ServiceLoader.<MyProvider>load(MyProvider.class)) {
myProviders.add(myProvider);
}
return myProviders;
}
但是相同的代码在Junit 5测试代码中返回空列表(ServiceLoader返回null)。如何使用Junit 5测试服务提供者模块。或者Junit是否有其他选择,允许我们创建测试模块(模块化测试API),该模块在模块信息中声明“ uses myspi.MyProvider”,并且可以与getMyProviders( )?
答案 0 :(得分:1)
基本上,您在正确的轨道上。您需要说服Java模块系统,当您将模块解析为测试运行时时,测试模块才是最重要的。
黑匣子测试很容易。
模块化世界中的白盒测试,这意味着测试模块中受保护和打包的私有成员非常棘手。至少有两种方法可以实现此目的:a)使用Java命令行选项在测试启动时配置Java模块系统,或b)将 main 源混合到 test 源中在编译时,并在您的 test 源代码中维护专用的module-info.java
。
请访问How to make a modular build with jdk > 1.8上发布的博客和示例的链接 为方便起见,以下是摘录:
在建蓝图https://github.com/sormuras/sandbox/tree/master/sors-modular-testing-blueprint
从https://github.com/sormuras/junit-platform-maven-plugin/tree/master/src/it
的“ modular-world-”开始的集成测试并且希望大多数IDE也不支持您。现在。
答案 1 :(得分:1)
已解决!
我已经将Junit从类路径删除到模块路径,并且还删除了所有Junit 4兼容性东西,例如RunWith()等,并使我的测试成为纯Junit 5测试。
我添加了一个module-info.java(Junit 5不需要打开模块,尽管书中讲的相反)
在对测试进行模块化之后,我发现它仍然无法执行ServiceLoader。然后,我开始亲自寻找故障。
我找到了!可以在基本模块中运行ServiceLoader东西,因为基本模块引用了导出的myProvider.jar,而后者又访问了同一目录中的myProvider-config.properties文件。没有此配置文件,myProvider将无法正常工作。
另一方面,有问题的测试模块引用了myProvider的eclipse项目而不是其导出的.jar文件,因此无法找到其配置文件并退出。我已经将该配置文件从Netbeans移至Eclipse,只需将其复制到同一目录中即可。因此缺少配置文件是问题所在。
更改项目设置,我可以毫无问题地运行测试。
我要感谢所有答复的参与者。