gpt4 book ai didi

java - 如何限制Java ServiceLoader仅加载测试包中定义的服务提供者

转载 作者:行者123 更新时间:2023-12-01 21:19:59 25 4
gpt4 key购买 nike

我有一个使用 ServiceLoader 的应用程序。
有一个服务接口(interface) MyFancyService 及其实现:AppClassA、AppClassB 和测试实现:TestClassC、TestClassD

应用程序包中有一个 META-INF.services,测试包中有另一个 META-INF.services。

META-INF.services in app point to provider classes AppClassA and AppClassB
META-INF.services in test point to provider classes TestClassC and TestClassD

运行应用时,ServiceLoader.load(MyFancyService.class)) 仅加载 AppClassAAppClassB。显然,类路径中没有测试类,这就是原因。我理解这一点,这是可取的

运行测试时,ServiceLoader.load(MyFancyService.java)) 加载所有类 AppClassA、AppClassB、TestClassC、TestClassD。

有没有办法限制服务加载器在运行测试时仅加载TestClassCTestClassD

最佳答案

当测试运行时,类路径中同时具有“测试”和“生产”类/资源。这就是加载所有四个服务的原因,这是所需的行为,显然您需要测试和产品类路径。

所以,最重要的是,你有两个选择:

选项 1

使用 PowerMock/PowerMockito 等工具来模拟静态方法 ServiceLoader.load。我自己没有尝试过,但一般来说,除非它是某种遗留代码,否则我不建议使用它。

选项 2

重构代码并模拟对服务加载器的调用,如下所示:

inteface MyServiceLoader {
void loadMyStuff(Class<?> type);
}

class MyServiceLoaderImpl implements MyServiceLoader {
public void loadMyStuff(Class<?> type() {
ServiceLoader.load(type);
}
}


// and now in ClassUnderTest:

public class ClassUnderTest {

private MyServiceLoader myServiceLoader;

public void thisIsAMethodToTest() {
...
myServiceLoader.loadMyStuff(MyFancyInterface.class);
}
}

在测试中,您可以使用mockito模拟接口(interface)MyServiceLoader.loadMyStuff并仅加载测试实现。

关于java - 如何限制Java ServiceLoader仅加载测试包中定义的服务提供者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58854511/

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