软件构造:JUnit抽象类和父类

在创建一个接口后,我们可能会有很多不同的类来实现该接口,同时这些类中对于各方法的具体实现各有差异,但这不变的是这些方法的具体实现的前置条件(pre-condition,参数类型和规范等)和后置条件(post-condition,返回值的类型和规范等)以及功能都遵循在接口中的声明(specification,简称Spec)。
那么在编写JUnit测试的时候,是不是我们要对这些类的每个方法都编写测试呢编程时,我们通常遵循的原则都是在写完每个方法的Spec后,不先编写具体实现代码,而是直接根据Spec来编写JUnit测试用例,也就是说虽然对于一个在接口中声明的方法Method在不同类中有不同的实现方式(当然有些测试需要根据代码的具体实现来进行,这里我们考虑的是那些根据Spec就能进行的测试),但其测试策略都是一致的,那么我们是不是要在每个测试文件中都复制一遍该测试用例呢/p>

  • 当然不用,其实从本质上来说JUnit测试文件同样遵循Java类文件的各个规则。也就是说,我们可以编写父类或抽象类JUnit测试并在其其中编写测试用例,而让每个类的JUnit测试文件都继承该抽象类或父类。这样在测试每个类时,都将跑一遍父类中的测试用例,这样就可以简化测试代码。这和JAVA类中的继承是相同的

那么怎么实现呢/p>

  • 我们可以想到父类中的JUnit测试肯定需要类的实例对象,而各个JUnti子类的测试实例对象又各不相同。为解决这个问题,可以在JUnit父类中用抽象方法获取具体实现,而在JUnit子类中编写具体的返回对象

以下是MIT课程实验中的一个例子:
现在我们有两个类,ConcreteEdgesGraph和ConcreteVerticesGraph,他们实现的方法都相同,有相同的Spec,那么对于这两个类的测试可以使用同一套JUnit测试GraphInstanceTest。

接着我们以测试ConcreteEdgesGraph的Junti文件ConcreteEdgesGraphTest文件为例,说明子类的编写方法。

这样一来,我们在运行ConcreteEdgesGraphTest测试文件时,就将运行其父类GraphInstanceTest中的测试,且测试的实例对象类型就是ConcreteEdgesGraph

文章知识点与官方知识档案匹配,可进一步学习相关知识Java技能树行为抽象和Lambda流和行为抽象91480 人正在系统学习中

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2020年5月25日
下一篇 2020年5月25日

相关推荐