这是我的应用程序的组合根:
MutablePicoContainer container = new DefaultPicoContainer();
container.addComponent(LDAPManager.class);
container.addComponent(LoginDelayer.class);
container.addComponent(CommandFactory.class);
container.addComponent(FileSystem.class);
container.addComponent(ProtocolFactory.class);
container.addComponent(new TemporaryFolder(container.getComponent(FileSystem.class), new File("abc")));
container.addComponent(ConnectedClientFactory.class);
container.addComponent(Server.class);
Server server = container.getComponent(Server.class);
这很可爱,但仍然存在一个问题:在系统测试时,我通常想要模拟或传递其中一两个依赖项的不同实现。如果我可以将上面显示的代码加上
container.addComponent(new TemporaryFolder(container.getComponent(FileSystem.class), new File("def")));
并让容器了解我想用这个新实例替换初始的 TemporaryFolder 实例。 pico-container(或其他Java轻量级容器)中是否有任何内置设施?如果不是,解决此问题的标准方法是什么?
谢谢
最佳答案
这可能是 IoC 框架特定的,但我们在 Windsor 中使用 .net 进行验收测试。我们的每个服务都将自己的容器与它们所需的所有组件连接起来。
在我们的验收测试中,我们从服务继承并将其称为TestXyzService
,并在其中覆盖任何需要覆盖的组件,但保留其余部分。通过这种方式,我们可以尽可能多地进行测试,而不会给自己带来太大的困难。
在我们的例子中,我们必须确保在基类中注册真实组件之前注册模拟或虚拟组件,因为第一个组件在 Windsor 中占据主导地位。
关于java - 仅更改 ioc 容器中大型依赖关系图中的一个依赖关系以进行测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9838115/