Eclipse 中集成了大量的单元测试工具。其中许多是基于 Junit 并在性能上有所扩充。我让我的学生们在面向对象的设计类中使用 Coverlipse 插件程序来检测他们的测试的代码覆盖率。我希望在他们所有的应用程序代码中有的覆盖率。一开始他们不喜欢这样,但是到了期中,他们的测试的覆盖率通常都达到。
  我已经为 TestNG,、djUnit、 Eclipse Test 和 Performance Tools Platform (TPTP) 安装了插件程序。其中每一个都有一组特性支持有效的单元测试。关键是有大量合适的单元测试工具提供给每一个开发人员,因此缺少工具不再被认为是没有创建单元测试的理由。
  测试带有复杂的依赖性?使用模拟对象
  一个好的单元测试检测一个独立的方法。在一个设计良好的系统里,对象们协同工作共同完成一项任务;因此,为了检验一种方法,通常我们需要提供使得这种方法完成其任务的其他对象。企业应用程序里的对象相当复杂,很难创建,并且他们的状态依赖外部的对象。一个数据库相关的应用程序有许多这样的对象,如连接、语句、结果集等等。我们想要单元测试简单快速的执行。如果我们需要在每次单元测试前将数据库重新设置到一个已知状态,那么测试会相当复杂并且运行速度自然会比我们期望得要慢。
  简化单元测试的一个流行技巧是创建仅用于测试中的模拟对象。为了达到快速测试的目的,我们创建模拟对象来代替真实的对象。模拟对象被 Tim Mackinnon、 Steve Freeman 和 Philip Craig 1 所支持并成为单元测试工具箱的主要组成部分。一些书籍和论文讲述了如何在单元测试中使用模拟对象,描述的是模拟对象应该具备的能力以及如何使用他们。尽管如此,在没有任何基础的情况下开始创建模拟对象是相当困难的。我们希望能够自动完成这项任务。
  有一些软件工具,像 EasyMock, 2 提供了自动帮助功能,但是它们可能很复杂而且也很难使用。此外,他们不是总能够与我们其他的开发工具兼容。但是利用现有的工具可以有一些创建模拟对象或是相当能力的简单方法。文章后面的部分将展示利用 Eclipse 平台做到这一点的一些方法。
  从接口创建模拟对象
  面向对象的设计专家建议我们对接口进行编程。如果我们这样做,设计会更加新颖、灵活并且对变化反应灵敏。我们来看这样一个对接口编程例子,我们使用 Java JDBC? API 来操作数据库。我们将考虑基于 JDBC API Tutorial and Reference, Second Edition 一书中代码的简单例子。在关系数据库中有一个表格,表格中有 a, b, c 三列,有整数型、字符串型和浮点型三种数据类型。下面的方法,在一个被称为 DatabaseExample 的类中,使用数据库 Connection 对象,从数据库中读取记录并打印出数值。