追求代码质量: 测试 Struts 遗留的应用程序
2009-11-19 00:00:00 来源:WEB开发网 闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌熼梻瀵割槮缁惧墽鎳撻—鍐偓锝庝簻椤掋垺銇勯幇顖毿撻柟渚垮妼椤粓宕卞Δ鈧獮濠勭磽閸屾艾鈧懓顫濋妸鈺佺疅缂佸顑欓崥瀣煕椤愵偅绶氱紓鍐╂礋濮婂宕掑▎鎴М濠电姭鍋撻梺顒€绉甸幆鐐哄箹濞n剙濡肩紒鎰殜閺屸€愁吋鎼粹€茬敖婵炴垶鎸哥粔鐢稿Φ閸曨垰鍐€妞ゆ劦婢€濞岊亪姊虹紒妯诲蔼闁稿海鏁诲濠氭晲婢跺﹤宓嗛梺缁樺姈缁佹挳宕戦幘璇叉嵍妞ゆ挻绋戞禍鐐叏濡厧浜鹃悗姘炬嫹

图 1. Action 类的输出耦合
图片看不清楚?请点击这里查看原图(大图)。
但是,就像在图 1 中可以看到的,在试图隔离 ChangePasswordAction 类并检验 execute() 方法时,该类给出了一些有代表性的挑战。为了有效地测试 execute() 方法,必须处理三层耦合。首先,到 Struts 自身的耦合;其次,Servlet API 代表一个障碍;最后,到业务对象包的耦合,进一步检查业务对象包,还会有数据访问层使用 Hibernate 和 Spring。
每种情况一个 mock?
即使在我编写本文时,我还可以听到开发人员的嘲笑者 认为我的测试问题通过明智地使用 mock 对象就能轻易解决。可以 用 mock 对象创建一级隔离,它会形成更容易的测试;但是,我要说的是,把目标对象通过 mock 排除所需要的付出级别,比起承认隔离测试困难所需要的付出,要多得多。在这种情况下,我会采用在更高层次上的测试,这级测试有时叫做集成测试。
对于更高的复杂性,请注意 清单 1 中的代码如何把 aForm 参数转换成 ChangePasswordForm 对象,它是 Struts ActionForm 类型。这些 JavaBeans 有一个 validate 方法,这个方法由 Struts 在调用 Action 类的 execute() 方法之前调用。
犯错误太容易了
在清单 2 中,可以看到所有这个复杂性会在哪里发生。ChangePasswordForm 的 validate() 方法的代码片段演示了保证两个属性(newPassword1 和 newPassword2)不为空并彼此相等的简单逻辑。但是,如果 Struts 发现 errors 集合(类型为 ActionErrors)包含一些 ActionError 对象,就会沿着错误路径走,例如带着出错消息重新显示 Web 页面。
更多精彩
赞助商链接