如何使用Junit 5测试服务提供商实施模块?

问题描述 投票:1回答:2

这是我的基本模块,需要实现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),在模块信息中声明“使用myspi.MyProvider”并且与getMyProviders一起工作正常( )?

java service junit5 java-module jigsaw
2个回答
1
投票

基本上你是在正确的轨道上。在解析模块是测试运行时时,您需要说服Java模块系统您的测试模块是唯一的thruth源。

黑盒测试很容易。

模块化世界中的白盒测试,即在模块中测试受保护和封装私有成员,是棘手的。至少有两种方法可以实现这一点:a)使用java命令行选项在测试启动时配置Java模块系统或b)在编译时将主源混合到测试源中,并在测试源中维护专用的module-info.java

请访问How to make a modular build with jdk > 1.8发布的博客和示例链接。以下是方便摘录:

Examples

Background and other resources

并期望大多数IDE也不支持你。目前。


1
投票

解决了!

我已将Junit从class-path移除到module-path,并删除了所有Junit 4兼容性内容,如RunWith()等,并使我的测试纯粹是Junit 5测试。

我添加了一个module-info.java(Junit 5不需要打开模块,尽管这些书反过来说明了)

在我模块化测试后,我发现它仍然没有执行ServiceLoader的东西。然后我开始自己寻找故障。

我找到了!可以在基本模块中运行ServiceLoader内容,因为基本模块引用导出的myProvider.jar,后者又访问同一目录中的myProvider-config.properties文件。如果没有此配置文件,myProvider将无法正常工作。

另一方面,有问题的测试模块引用了myProvider的eclipse项目而不是其导出的.jar文件,因此无法找到其配置文件并退出。我将此配置文件从Netbeans移动到Eclipse,只需将其复制到同一目录中即可。因此缺少配置文件是问题所在。

更改项目设置我可以运行测试而不会出现任何故障。

我要感谢所有回复的贡献者。

© www.soinside.com 2019 - 2024. All rights reserved.