当前位置:  开发笔记 > 编程语言 > 正文

设计可测试性的构造函数

如何解决《设计可测试性的构造函数》经验,为你挑选了1个好方法。

我正在使用一些现有的代码,试图添加它并增加它的单元测试.但是在使代码可测试时遇到了一些问题.

原始构造函数:

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".

这对我来说很难:我无法弄清楚如何在其他地方简单地推动这些"新"调用来打破这一系列事件.我错过了什么?



1> Rich Seller..:

看看使用Spring等依赖注入框架.控制反转的这种应用意味着您的每种类型都可以避免您看到的陷阱,使配置保持"连线"组件在一起.

Spring的这篇介绍(pdf)给出了Spring的全面概述.第一章或第二章应该足以解释这些概念.

另请参阅Martin Fowler的Inversion of Control Containers和Dependency Injection模式

推荐阅读
携手相约幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有