诊断Java代码: 消除包间的耦合关联 - 编程入门网
己的意愿将其插进新的应用程序。而且这种类型的编程还使单元测试效率更高。
在测试时,可以使用特殊的“仿制品”组件将程序的各个组件链接起来,这些“仿制品”组件的类只是记录测试组件的行为。实质上,这些仿制品组件充当了与记录器(请参阅 参考资料中的“进行记录器测试以正确调用方法”)类似的角色,但它是在组件这一层次上的。 被测试组件类似于笛卡尔的钵中之脑(brains in a vat);它们不能区分是与仿制品组件相连还是与真正的组件相连。例如,在先前的样本应用程序中,我们可以编写一个特殊的 test_app 复合,它将 app_view 单元与 test_toolkit 单元联系起来,如下所示:
test_toolkit 包会导出与 toolkit 相同签名的包,但这个包只包含一些仿制的对象,使 app_view 认为它是与真正的 toolkit 相连。这些仿制对象可以记录 app_view 的行为,因为可以在单元测试时检查这些记录。 将这个系统与 Java 包系统相比较会发现,在这个系统中,每个源文件必须显式地声明要导入的包。在 Java 包系统中,欺骗整个包链接到测试包的唯一方法是编辑所有的源文件,然后重新编译这些文件。这一过程不能真正实现自动化测试。 遗憾的是,因为 Jiazzi 不能处理反射或 JNI(这一点是有情可原的),而且还因为许多内置的 Java API 广泛地使用这些设施,所以不可能将现有的 API 包转换成 Jiazzi 组件。但是,如果可以转换成 Jiazzi,那么我们能够对程序执行更强大的测试。例如,在测试期间,可以将使用 Swing API 的程序连接到仿制的 Swing 组件,从而在没有真正尝试画图形对象的情况下,可以确保调用所有相应的 API。用类似的手段,我们可以测试与 java.io 包、Java3D、JDBC、RMI 以及任何其它 API 的交互,在这些 API 中,性能或功能的本质造成了客户机难以进行测试。 好了,这是一个美好的梦想,是吗?不过,即使反射和 JNI 不能让我们使现有的 API 成为一流的 Jiazzi 单元,但仍可能有折衷的办法。 虽然不能去耦现有 API 之间的连接,但可以去耦新单元与这些 API 的连接。实质上,可以将这些 API 与只导出类的特殊单元捆绑在一起;导入仍然与现有的 Java 包系统硬性地连接在一起。如果这些 API 是真正的单元,则这样做可以实现 99% 的功能;只有那些想对现有 API 构建第三方选择的程序员会对此不满意。 可喜的是,Jiazzi 将朝着这个方向或通过类似的途径变化着,这使我们可以和现有的 API 一起使用它。同时,它还为测试不使用反射或 JNI 的包提供了功能强大的机制。 去耦历史 最初开发 Jiazzi 的动机是为特性的可扩展性创建一种机制 ― 将一个设计拆分成几个特性(每个单独的组件包含其中一个特性)。基于组件的编程主张,在以后的编程中,开发人员可以从组件供应商提供的成品组件上开发程序。具有通用签名的组件就可以象汽车零部件一样进行互换。 无论这一天是否会到来,即使没有繁荣的组件软件市场,基于组件编程仍有许多好处。尤其是,这种类型的编程使单元测试效率更高。 正如我们所展示的,用 Jiazzi 进行基于组件的编程提供了一种功能强大的测试程序组件的手段,并且它可以使用现有的 Java(或 Jython,或 JSR-14)源文件。我们可以从这一强大的工具中获益。这一工具及其它类似的工具是面向测试编程的必要工具。 下次,我将讨论 Jam(一种 Java 语言的扩展),它允许基于 mixin 的编程。就象 Jiazzi 提供了去耦包相关性的方法一样,mix |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |