2.1.5 测试核心方法
准备。既然我们已经定义了3个核心方法,就可以测试它们。但是BagInterface中的其他方法怎么办呢?因为ArrayBag(程序清单2-1中给出的)实现了BagInterface,所以Java语法检查程序将查看这个接口中声明的每个方法的定义。我们是否应该等到完成它们的定义后才开始测试?绝对不要!在你写方法时就进行测试会让你尽早发现逻辑错误。不过,不是写BagInterface中每个方法的完整实现,而是对可暂时忽略的方法给出它们的不完整定义。
一个不完整定义的方法称为存根(stub)。存根仅需要让语法检查器通过即可。例如,对于每个返回一个值的方法,通过添加一个return语句让其返回一个哑值来避免语法错误。返回布尔值的方法可以返回假。返回对象的方法返回null。而void方法可以简单地只有一个空方法体。
例如,方法remove最终将返回被删除的项,所以它的存根必须含有一个return语句,如下所示。
void方法clear的存根应该是
注意,如果你想在测试程序中调用存根,则存根应该显示一条信息来报告它被调用过。
程序设计技巧:不要等到完全实现ADT后才测试它。写存根,这是所需方法的不完整定义,可以尽早开始测试。
测试程序。程序清单2-2中的程序专门用来测试开发阶段的类ArrayBag的核心方法add和toArray。初始时,main方法使用默认构造方法创建一个空包。因为这个包的容量是25,所以如果你添加少于25个项,数组不应该满。因此,每次添加后,add方法都应该返回真。实际上,程序的描述性输出指明被测试的方法是正确的。
随后在main方法中,我们考虑容量为7的包,然后给它添加7个字符串。此时,如果试图进行第8次添加,add方法应该返回假。同样,程序的描述性输出表明方法是正确的。
程序清单2-2 测试ArrayBag类的核心方法的程序
程序设计技巧:方法的全面测试还应该包括实参取其对应参数合理范围内外值的情况。
注意,除了main方法外,ArrayBagDemo1还有其他两个方法。因为main是静态的,且调用这两个方法,所以它们也必须是静态的。方法testAdd的参数接收一个包和一个字符串数组。该方法使用循环将数组中的每个字符串添加到包中。它还测试了add方法的返回值。最后,方法displayBag的参数是一个包,并使用包的方法toArray来访问它的内容。一旦我们有一个包项的数组,就可以用循环来显示它们。
自测题8 在ArrayBagDemo1的main方法中执行下列语句的结果是什么?