java - 仅更改 ioc 容器中大型依赖关系图中的一个依赖关系以进行测试

标签 java oop unit-testing testing dependency-injection

这是我的应用程序的组合根:

    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/

相关文章:

java - 如何将带有 Alpha 的 Type_Byte_Binary BufferedImage 转换为 TYPE_4BYTE_ABGR

javascript - 如何定义一个 CoffeeScript 类,在第一次实例化时加载 jQuery,然后触发回调?

javascript - 如何在类中的(作用域)addEventListener 上应用removeEventListener?

C# 银行示例 - 客户类 - 取款、存款等

java - 在网页中使用分页真的有任何性能优势吗?

java - 如何控制log4j中的日志控制台输出

java - 可绘制背景 View - 什么类型的资源?

java - 接收 tdd url 测试的空输出

c - 如何使用 gcov 对动态库进行单元测试?

javascript - Jasmine 测试 - 如何测试正在应用的 css 类?