我正在使用一些现有的代码,试图添加它并增加它的单元测试.但是在使代码可测试时遇到了一些问题.
原始构造函数:
public Info() throws Exception { _ServiceProperties = new ServiceProperties(); _SshProperties = new SshProperties(); }
我知道这很糟糕,显然不可测试.在junit环境中,此类将无法每次创建,因为它无法找到构造自身的必要属性.现在,我知道这个类可以通过简单地改变以'new'作为参数的方式移动任何东西来测试.
所以我最终得到:
新构造函数:
public Info(ServiceProperties srvProps, SshProperties sshProps) throws Exception { _ServiceProperties = srvProps; _SshProperties = sshProps; }
这允许我正确地测试这个Info类.但问题是,现在所有这些工作都被推到了其他类:
其他一些方法:
public void useInfo() throws Exception { ServiceProperties srvProps = new ServiceProperties(); SshProperties sshProps = new SshProperties(); Info info = new Info(srvProprs, sshProprs); doStuffWithInfo(info); }
现在这种方法是不可测试的.我所要做的就是推迟发生这些Property对象的构造,在其他地方,某些代码将被卡住,实际上必须调用"new".
这对我来说很难:我无法弄清楚如何在其他地方简单地推动这些"新"调用来打破这一系列事件.我错过了什么?
看看使用Spring等依赖注入框架.控制反转的这种应用意味着您的每种类型都可以避免您看到的陷阱,使配置保持"连线"组件在一起.
Spring的这篇介绍(pdf)给出了Spring的全面概述.第一章或第二章应该足以解释这些概念.
另请参阅Martin Fowler的Inversion of Control Containers和Dependency Injection模式