但是,请注意单元测试本身要比编写严格的函数方法简单得多。要测试严格的函数方法,涉及的全部就是用各种具有代表性的输入调用这些方法,并检查它们的输出(并确保它们在应该抛出异常时能抛出)。
在测试修改数据结构状态的方法时,我们必须首先执行这样的操作,这些操作是将输入数据放入该方法所期望的状态中所需要的,然后在调用该方法之后,检查是否正确执行了客户机所期望的数据的每次修改。
用重构工具封装
在编写新代码时这些技巧很有用,但是当您必须维护几乎不能译码的旧代码时,怎么办呢?重构、重构、还是重构。
尽管重构旧代码很费时,但是这些时间是值得的,特别是所有支持重构的工具现在也支持 Java 代码了。现在已经有许多自动重构 Java 代码的强大工具,这些工具可以自动保存关键的不变量。
重构 Java 代码的一个功能相当齐全的工具是 IDEA 开发环境。该环境对相当多的 Martin Fowler 重构模式提供自动支持。我找到的另一个非常有用的工具是 CodeGuide,它是一个来自德国的 IDE。尽管相对于 IDEA,其自动重构的列表很小,但是它显示了一个极其强大的特性 ― 连续编译。当您输入新代码时,CodeGuide 分析它并告知您项目中是否不完整(当然,这产生很短的延迟,它防止对每次击键发出错误信号)。
尽管连续编译对响应产生负面影响,但是在某些上下文中非常值得这样的等待。例如,您可以在字段前输入 final,会立即看到项目中是否不完整。如果无,那么您知道该字段在该程序的任何地方都没有被修改。同样,您可以在字段之前输入 private,那么立即获得对该字段的所有外部访问的列表(以错误的形式)。
CodeGuide 的另一个极佳特性是它用泛型类型对 JSR-14 实验扩展提供了无缝支持(计划正式添加到 Java 1.5)。
尽管为了可译码性而编写代码会花费非常多的时间和精力,但是它会有助于提高代码的生命期和健壮性,而且它可以显著提高面临维护代码任务的那些程序员的生活质量。最后,重构旧代码使之更易维护很费时,但当您下次必须修正错误时您就会知道这样做是值得的。