追求代码质量 - 用代码度量进行重构 - 编程入门网
= getStatus(status, lastChangedStatus);
//...more code below
请记住运行现有的测试,以验证什么都没被破坏! 测试私有方法 您将注意到在 清单 2 中定义的新 getStatus() 方法被声明为 private。这 在想验证隔离的 方法的行为的时候就形成了一个有趣的挑战。有许多方法可以 解决这个问题: 把方法声明成 public。 把方法声明成 protected,并把测试用例放在同一个包中。 在父类中建立一个内部类,这个内部类是个测试用例。 还有另一个选择:保留方法现有的声明不变(即 private),并采用优秀的 JUnit 插件项目来测试它。 追求代码质量 - 用代码度量进行重构(4)时间:2010-12-11 IBM Andrew GloverPrivateAccessor 类 JUnit 插件项目有一些方便的工具,可以帮助 JUnit 进行测试。其中最有用 的一个就是 PrivateAccessor 类,它把对 private 方法的测试变成小菜一碟, 无论选择的测试框架是什么。PrivateAccessor 类对 JUnit 没有显式的依赖, 所以可以把它用于任何测试框架,例如 TestNG。 PrivateAccessor 的 API 很简单 —— 向 invoke() 方法提供方法的名称( 作为 String)和方法对应的参数类型和相关的值(分别在 Class 和 Object 数 组中),就会返回被调用方法的值。在幕后,PrivateAccessor 类实际上利用 Java 的反射 API 关闭了对象的可访问性。但是请记住,如果虚拟机有定制的安 全性设置,那么这个工具可能无法正确工作。 在清单 4 中,调用 getStatus() 方法时两个参数值都设置为 null。 invoke() 方法返回一个 Object,所以要转换成 String。还请注意 invoke() 方法声明它要 throws Throwable,必须捕获异常或者让测试框架处理它,就像 我做的那样。 清单 4. 测试私有方法
请注意 invoke() 方法被覆盖成可以接受一个 Object 实例(如清单 4 所示 )或一个 Class(这时期望的 private 方法也是 static 的)。 还请记住,使用反射调用 private 方法会对生成的结果带来一定程度的脆弱 性。如果有人改变了 getStatus() 方法的名字,以上测试就会失败;但是,如 果经常测试,就可以迅速地进行适当的修正。 结束语 在抗击圈复杂度时,请记住大部分编写到应用程序中的路径是应用程序的整 体行为所固有的。也就是说,很难显著地减少路径的整体数量。重构只是把这些 路径放在更小的代码段中,从而更容易测试。这些小的代码段也更容易维护。 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |