快速业务通道

追求代码质量 - 用代码度量进行重构 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-23
= getStatus(status, lastChangedStatus); //...more code below

请记住运行现有的测试,以验证什么都没被破坏!

测试私有方法

您将注意到在 清单 2 中定义的新 getStatus() 方法被声明为 private。这 在想验证隔离的 方法的行为的时候就形成了一个有趣的挑战。有许多方法可以 解决这个问题:

把方法声明成 public。

把方法声明成 protected,并把测试用例放在同一个包中。

在父类中建立一个内部类,这个内部类是个测试用例。

还有另一个选择:保留方法现有的声明不变(即 private),并采用优秀的 JUnit 插件项目来测试它。

追求代码质量 - 用代码度量进行重构(4)

时间:2010-12-11 IBM Andrew Glover

PrivateAccessor 类

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. 测试私有方法

public void testGetStatus() throws  Throwable{   AccountAction action = new AccountAction();   String value = (String)PrivateAccessor.invoke(action,     "getStatus", new Class[]{IStatus.class, List.class},      new Object[]{null, null});   assertEquals("should be No Changes Since Creation",    "No Changes Since Creation", value); }

请注意 invoke() 方法被覆盖成可以接受一个 Object 实例(如清单 4 所示 )或一个 Class(这时期望的 private 方法也是 static 的)。

还请记住,使用反射调用 private 方法会对生成的结果带来一定程度的脆弱 性。如果有人改变了 getStatus() 方法的名字,以上测试就会失败;但是,如 果经常测试,就可以迅速地进行适当的修正。

结束语

在抗击圈复杂度时,请记住大部分编写到应用程序中的路径是应用程序的整 体行为所固有的。也就是说,很难显著地减少路径的整体数量。重构只是把这些 路径放在更小的代码段中,从而更容易测试。这些小的代码段也更容易维护。

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号