gpt4 book ai didi

java - 默认依赖实现,没有DI框架如何处理?

转载 作者:行者123 更新时间:2023-12-01 15:30:46 25 4
gpt4 key购买 nike

我对如何提供依赖项的默认值以及如何处理它们的测试有一些疑问。假设我的类(class)如下:

class MyService {
private AnotherService dependency;
...
}

由于这是遗留应用程序,因此没有依赖项注入(inject)(甚至是自制的)。因此,要提供依赖关系,有多种方法(例如构造函数、setter)。但我想为这个依赖项提供默认实现,但我不确定如何做到这一点。

我会这样做

class MyService {
private AnotherService dependency = new AnotherServiceImpl();
...
}

但是这个依赖关系总是在创建 MyService 时初始化。对于测试我不想要这个,因为我想提供模拟实现。我想到了类似的事情

class MyService {
private AnotherService dependency;

private AnotherService getDependency() {
if(dependency == null) {
dependency = new AnotherService();
}
return dependency
}

setDependency(AnotherService dependency) {
this.dependency = dependency;
}
}

现在,如果所有依赖项调用首先通过 getDependency() 完成,依赖项将以我认为的惰性方式加载,我可以设置自己的测试方式。

我知道很难开始在遗留代码中引入诸如依赖注入(inject)之类的更改,因为遗留代码还没有它。例如。如果我在构造函数中提供依赖项,依赖项实例化的问题只会向上移动一级。

第二个问题是,如果现在只有一种实现,如何提供依赖项。我正在使用 Mockito ,它的 @InjectMocks 可以将模拟注入(inject)私有(private)字段。我想知道是否需要公开 setDependency 或构造函数 arg 依赖项并使用接口(interface)来实现这一点?现在不是过度设计了吗?我不想仅为了测试而更改代码。

最佳答案

一个常见的模式是重载你的构造函数:

class MyService {
private AnotherService dependency;

MyService() {
this(new AnotherServiceImpl());
}

MyService(AnotherService dependency) {
this.dependency = dependency;
}

...
}

现有代码将像以前一样工作,通过调用默认构造函数,而测试可以使用具有可注入(inject)依赖项的构造函数。

关于java - 默认依赖实现,没有DI框架如何处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9530672/

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