模仿对象
模仿对象使您可以为测试而模仿对象(请参阅参考资料)。给模仿对象一个接口,您希望实际组件具备这个接口,然后使用模仿对象,直到实际组件成形。但模仿对象不仅仅只是还未存在的组件的存根。可以评估代码如何与模仿对象交互(譬如,验证调用了某个方法多少次以及检查状态等)。最近模仿对象得到了大力推广,但我认为它们被滥用了,它们太“重”以至于不切实际。
伪对象
有时我所希望的是一个伪对象,它实现了与真实对象相同的接口,可以回答关于我在测试中如何与它交互这样一些特定问题。这就是伪对象 — 一种用来伪装测试中对象的轻量型方式。伪对象可以是您所需要的任何对象。它是我曾使用过的最全面灵活的工具、模式和思考方式,我推荐您使用它。例如,我在前面创建的 Person 对象的伪对象类似于清单 8 中的样子:
清单 8. Person 的伪对象

如果可行,我总是试图采用正在测试类的伪类(在这里是 ShamPerson)作为测试中的内部类。通过这样做,从而向不必需要伪类的其它事物隐藏了该伪类。
一旦有了伪对象,我就可以在不直接测试 Person,而是测试其它代码如何与 Person 实例进行交互的测试中用到它。我可以实例化 ShamPerson,然后与它交互,然后断言 getAgeWasCalled 为 true。
编程革命
在编写代码前编写测试极大地改变了我作为程序员的生活,它同样也可以改变您的生活。我的代码始终比先编写测试之前所写的代码更简单、更干净以及更健壮。只要记住这条规程 — 在编写代码之前考虑如何测试代码 — 就可以使代码变得更好。如果每个软件开发团队不采用其它 XP 做法,并且只是先编写测试,则软件开发世界将会令人惊异地变得更好。采用这一点做法,任何程序员都可以先编写测试。这些工具(JUnit 和 Eclipse 等)是免费的,只等您去实践它。我已经看到投资得到了及时的回报,我相信您也会这样做的。
参考资料
请参与本文的论坛。(您也可以单击本文顶部或底部的讨论来访问该论坛)。
请阅读 Kent Beck 的书 Test-Driven Development: By Example,其中贯穿于整本书的一个示例讲述了如何先编写测试。祝您愉快,并希望它对您有帮助。
JUnit 是一个很棒的工具,其用途是用 Java 语言编写程序员测试。这个站点链接了许多文章和工具。
在 Malcolm Davis 的“利用 Ant 和 JUnit 进行增量开发 ”(developerWorks,2000 年 11 月)文章中,他展示了单元测试如何改进您的代码,以及为您节省时间。
您可以在 http://www.mockobjects.com/ 找到关于模仿对象的更深入讨论。
在 Nick Lesiecki 的文章“AspectJ 和模仿对象的测试灵活性”(developerWorks,2002 年 5 月)中,他介绍了围绕测试案例隔离的问题,并向我们展示如何使用模仿对象和 AspectJ 来开发精确和健壮的单元测试。
如果您还没有用过 Eclipse,请查看 Eclipse,它是一个很好的用于基于 XP 开发的环境。
请阅读 ObjectMother 模式(PDF)。
设计模式(Erich Gamma 等,Addison-Wesley,1995 年)是一本关于这方面的权威性著作。
developerWorks 上的整个 揭开极端编程的神秘面纱 系列分析了 XP 实践(带有个人观点)。文章“关注价值”(2003 年 2 月)详细介绍了一些要点以及对于项目团队它们意味着什么;““XP 精华”重访,第 2 部分”(2002 年 9 月)讲述了结对编程的原理。
通过“Extreme Programming with IBM VisualAge for Java”(developerWorks,2001 年 4 月)一文,了解为什么 VisualAge for Java 对于 XP 团队是一个很棒的工具。
在 developerWorks Java 技术专区可以找到数百篇关于 Java 编程各个方面的文章。