gpt4 book ai didi

java - 在 Eclipse 插件中测试 ServiceLoader

转载 作者:行者123 更新时间:2023-11-30 04:59:09 27 4
gpt4 key购买 nike

我的工作区中有四个 Eclipse 插件项目(创建一个新的 Java 项目,右键单击,配置,转换为插件项目)。第一个(my.runtime)包含一个接口(interface)(MyFactoryInterface)和一个类(MyClient),该类定义了一个方法(List<String> getAllFactoryNames()),该方法通过java.util.ServiceLoader加载该接口(interface)的所有实现并调用一个方法(String getName()) ”),收集结果并将其返回到列表中。

为了测试该类,我在第二个项目中进行了 JUnit 测试(my.runtime.test,设置为my.runtime作为 Fragment-Host),检查虚拟实现是否返回名称(MyDummy,返回"Dummy" )我在my.runtime.test项目中位于MyClient.getAllFactoryNames()返回的列表中。到目前为止,一切正常。

在第三个项目(my.extension,以my.runtime作为依赖项)中,我有一个类(MyHello),它使用MyClient.getAllFactoryNames()返回的名称来返回问候语列表("Hello "+name)。

再次,为了测试这一点,我有一个项目(my.extension.test,其中my.extension作为 Fragment-Host)包含另一个实现(MyWorld,返回"World"作为名称)和一个 JUnit 测试用例,检查"Hello World" 位于MyHello.getGreetings()返回的问候语中。此测试失败,因为 MyClient 仍然只找到MyDummy实现,而不是MyWorld实现。两种实现都附有META-INF/services/my.runtime.MyFactoryInterface文件中的匹配条目。

我目前使用以下代码来加载实现:

ServiceLoader<MyFactoryInterface> myFactoryLoader = ServiceLoader.load(MyFactoryInterface.class);
for (MyFactoryInterface myFactory : myFactoryLoader) {

我知道我可以提供一个类加载器作为ServiceLoader.load的第二个参数,但我不知道如何获得一个知道所有插件项目的类加载器......有什么建议吗?或者 ServiceLoader 不是解决这个问题的正确工具?

最佳答案

如果有人遇到同样的问题:MyClientServiceLoader.load(MyFactoryInterface.class, Thread.currentThread().getContextClassLoader()) 的组合和 Thread.currentThread().setContextClassLoader(MyWorld.class.getClassLoader()); 在第二个测试中完成了这项工作。

关于java - 在 Eclipse 插件中测试 ServiceLoader,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7526615/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com