【发布时间】:2011-09-23 09:03:39
【问题描述】:
我的工作区中有四个 Eclipse 插件项目(创建一个新的 Java 项目、右键单击、配置、转换为插件项目)。第一个 (my.runtime) 包含一个接口 (MyFactoryInterface) 和一个类 (MyClient),该类定义了一个方法 (List<String> getAllFactoryNames()),该方法通过 java.util.ServiceLoader 加载该接口的所有实现并调用一个方法 (@987654326 @) 在它们上,收集结果并在列表中返回它们。
为了测试该类,我在第二个项目中进行了 JUnit 测试(my.runtime.test,设置为 my.runtime 作为 Fragment-Host),检查名称是否由虚拟实现返回(MyDummy,返回 @ 987654330@) 我在my.runtime.test 项目中是在MyClient.getAllFactoryNames() 返回的列表中。到目前为止,它运行良好。
在第三个项目中(my.extension,以my.runtime 作为依赖项)我有一个类(MyHello),它使用MyClient.getAllFactoryNames() 返回的名称返回问候列表("Hello "+name)。
再次,为了测试这一点,我有一个项目(my.extension.test,my.extension 作为 Fragment-Host)包含另一个实现(MyWorld,返回 "World" 作为名称)和一个 JUnit 测试用例检查 @ 987654342@ 在MyHello.getGreetings() 返回的问候语中。此测试失败,因为 MyClient 仍然只找到 MyDummy 实现,而不是 MyWorld 实现。这两种实现都伴随着META-INF/services/my.runtime.MyFactoryInterface 文件中的匹配条目。
我目前使用以下代码来加载实现:
ServiceLoader<MyFactoryInterface> myFactoryLoader = ServiceLoader.load(MyFactoryInterface.class);
for (MyFactoryInterface myFactory : myFactoryLoader) {
我知道我可以提供一个 ClassLoader 作为ServiceLoader.load 的第二个参数,但我不知道如何获得一个了解所有插件项目的...有什么建议吗?还是 ServiceLoader 不是解决这个问题的合适工具?
【问题讨论】:
标签: java eclipse unit-testing plugins serviceloader