前言:我的默认操作模式是使用 IoC 容器和构造函数注入。这使得使用模拟依赖项进行测试变得微不足道。
我开始开发一个 IntelliJ 插件,我想利用控制反转。由于这是一个插件,因此实际上没有容器选项(对吗?)所以我想我需要使用服务定位器模式。
如何使用带有服务定位器模式的模拟进行测试?
我能想到的最好方法是为我的定位器使用一个接口,使用静态 getter 在每个服务的默认构造函数中设置它,并拥有一个 setter,以便我可以设置一个模拟定位器。它看起来像这样:
public class MyService {
private IServiceLocator locator;
public MyService() {
setLocator(ServiceLocator.locator());
}
public void setLocator(IServiceLocator locator) {
this.locator = locator;
}
}
现在我可以模拟IServiceLocator
并MyService
在我的测试中设置它。然后我可以期待一个类似的调用locator.dependency1()
并让它返回一个模拟的依赖项。
这种方法的主要问题是定位器设置器仅用于支持测试。有没有更好的办法?