【发布时间】:2018-09-04 09:10:36
【问题描述】:
这是我的基础模块,需要实现 myspi 包中定义的接口。各种提供者可以提供 MyProvider 实现。基本模块通过 myspi.MyProvider 接口实现使用它们。
module base {
exports myspi;
uses myspi.MyProvider;
}
这是我的示例实现模块,它使用 MyProviderImpl 提供 MyProvider 实现
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),在模块信息中声明“使用 myspi.MyProvider”并与 getMyProviders( )?
【问题讨论】:
-
这值得一看 stackoverflow.com/questions/52110023/… ,Sormuras 的回答暗示了模块测试的世界是什么样子的。
-
我已经可以为其他模块编写黑盒测试并访问它们导出的包。这里的问题是为服务提供商导出编写测试,如上所述。我无法在测试中加载服务。无论如何,我现在正在阅读 Somuras 的答案,希望能找到线索。也许我应该将实现作为一个没有模块信息的普通旧 JAR 移动,并将这个 jar 测试为一个简单的库,并使用这个库来构建服务提供者模块。但这是一个丑陋的解决方案。
-
为什么不用
new MyProviderImpl()实例化提供程序?您要测试实现还是配置? -
johanneslink 因为,会有不止一个 MyProviderImpl()。他们可以使用相同的 API 提供不同的数据内容,并且应用程序将允许在 3rd 第三方提供商之间切换。当然我可以测试我的单个模拟实现,但我已经在 Java 9 之前完成了这些测试。在模块化之后,我想测试我的基本模块是否会找到任何第 3 方提供者,并通过基本模块实用程序类将它们绑定到我的应用程序,所以我可以使用所有这些来测试其余的基本模块 API。所以实际上我想用从提供者那里获得的内容来测试基本模块的其余部分。
标签: java service junit5 java-module java-platform-module-system