OOP的一个很好的机制是使用抽象类,抽象类是不能被实例化的,只能提供给派生类一个接口。设计人员通常使用抽象类来强迫实现人员从基类派生,这样可以确保新的类包含一些期待的功能。

在Junit对抽象类的测试中再次引入工厂设计模式,其测试思想是:抽象类不能被实例化,所以使用具体类测试抽象类是不可以的。因此,构造抽象类的测试类必须也是抽象的。该类需要强制声明两种类型的抽象方法。第一类抽象方法即工厂方法,返回所有被测试抽象类的具体子类实例,第二类定义抽象方法返回所有被测试抽象类的具体子类行为期望值。如下面代码,Commodity类是一个商品抽象类,该类的抽象方法描述具体如下:

getCommodityName():取商品名称

changerName():修改商品名称

getCommodityPrice():取商品价格

changerPrice():修改商品价格

Commodity类具体代码如下

package com.fastpiont;

public abstract class Commodity {

public abstract String getCommodityName();// 取得商品名称

public abstract void changerName(String newName);// 修改商品名称

public abstract double getCommodityPrice();// 取得商品价格

public abstract void changerPrice(double newPrice);// 修改商品价格

}

CommodityTestCase是Commodity抽象类的测试类,同样该类被声明为抽象的。Commodity抽象类包含了getCommodity()工厂方法返回具体类实例,因为这才是真正的被测试对象。PrepareAndGetExpectedName()、PrepareAndGetExpectedPrice()、PrepareAndChangerExpectedName()、PrepareAndChangerExpectedPrice()四组方法分别返回具体类实例行为的期望值,即该实例行为的判断基准,具体代码如下:

package com.fastpiont;

import static org.junit.Assert.*;

import org.junit.After;

import org.junit.Before;

import org.junit.Test;

public abstract class CommodityTest {

Commodity comm;

public abstract Commodity getCommodity();// 工厂方法,返回具体商品类

public abstract String prepareAndGetExpectedName();// 返回期望值

public abstract double prepareAndGetExpectedPrice();

public abstract String repareAndChangerExpectedName();// 返回更改期望值

public abstract double prepareAndChangerExpectedPrice();

@Before

public void setUp() throws Exception {

comm = getCommodity();

}

@After

public void tearDown() throws Exception {

}

@Test

public void testGetCommodityName() {

String expected = prepareAndGetExpectedName();

String received = getCommodity().getCommodityName();

assertEquals(expected, received);

}

@Test

public void testChangerName() {

comm.changerName(repareAndChangerExpectedName());

assertEquals(repareAndChangerExpectedName(), comm.getCommodityName());

}

@Test

public void testGetCommodityPrice() {

double expected = prepareAndGetExpectedPrice();

double received = getCommodity().getCommodityPrice();

assertEquals(expected, received);

}

@Test

public void testChangerPrice() {

comm.changerPrice(prepareAndChangerExpectedPrice());

assertEquals(prepareAndChangerExpectedPrice(), comm.getCommodityPrice());

}

}

现在根据抽象类测试思想构造一个集成了Commodity抽象类的具体商品子类Commodity_Book,Commodity_Book类的构造方法有两个传参,即根据传入的书籍名称值和书籍单价值生成一本书实例。Commodity_Book类不鼓励直接修改书籍的属性,但是可以通过连歌公共方法changerName()和changerPrice()来实现,具体代码如下:

package com.fastpiont;

public class Commodity_Book extends Commodity {

private String book_name;

private double book_price;

public Commodity_Book(String bookname, double bookprice) {

book_name = bookname;

book_price = bookprice;

}

public void changerName(String newName) {

setBook_name(newName);

}

public void changerPrice(double newPrice) {

setBook_price(newPrice);

}

public String getBook_name() {

return book_name;

}

private void setBook_name(String book_name) {

this.book_name = book_name;

}

public double getBook_price() {

return book_price;

}

private void setBook_price(double book_price) {

this.book_price = book_price;

}

@Override

public String getCommodityName() {

// TODO Auto-generated method stub

return getBook_name();

}

@Override

public double getCommodityPrice() {

// TODO Auto-generated method stub

return getBook_price();

}

}

Commodity_BookTestCase类继承了CommodityTestCase抽象类,整个类显得非常简单,包括工厂方法返回一个具体的Commodity实例和四个针对该实例的期望值设定,具体代码如下:

package com.fastpiont;

import static org.junit.Assert.*;

import org.junit.After;

import org.junit.Before;

import org.junit.Ignore;

import org.junit.Test;

public abstract class CommodityTest {

Commodity comm;

public abstract Commodity getCommodity();// 工厂方法,返回具体商品类

public abstract String prepareAndGetExpectedName();// 返回期望值

public abstract double prepareAndGetExpectedPrice();

public abstract String repareAndChangerExpectedName();// 返回更改期望值

public abstract double prepareAndChangerExpectedPrice();

@Before

public void setUp() throws Exception {

comm = getCommodity();

}

@After

public void tearDown() throws Exception {

}

@Test

public void testGetCommodityName() {

String expected = prepareAndGetExpectedName();

String received = comm.getCommodityName();

assertEquals(expected, received);

}

@Test

public void testChangerName() {

comm.changerName(repareAndChangerExpectedName());

assertEquals(repareAndChangerExpectedName(), comm.getCommodityName());

}

@Test

public void testGetCommodityPrice() {

double expected = prepareAndGetExpectedPrice();

double received = comm.getCommodityPrice();

assertEquals(expected, received, 0.001);

}

@Test

public void testChangerPrice() {

comm.changerPrice(prepareAndChangerExpectedPrice());

assertEquals(prepareAndChangerExpectedPrice(),

comm.getCommodityPrice(), 0.001);

}

}

这种针对抽象类的测试方法是Junit推导者所主张的,好处在于该抽象类的所有具体子类都不用在测试抽象类中的所有抽象发发(抽象类中的具体方法除外,因为该方法可能被具体子类覆盖),符合XP测试的接口测试定义。

转载于:https://www.cnblogs.com/Automation_software/archive/2011/01/25/1944393.html

Junit实现抽象类测试(一)相关推荐

  1. 单元测试之JUnit 5 参数化测试使用手册

    1. 概要 junit5是下一代JUnit测试框架,新增了很多特性帮助开发人员更好得编写测试用例.其中一大特性就是参数化测试,其目的就是让我们可以使用不同的参数多次执行一个测试方法,从而覆盖不同的条件 ...

  2. junit动态忽略测试_有条件忽略测试的JUnit规则

    junit动态忽略测试 我一直认为使用@Ignore停用测试是一个坏主意. 例外,这可能是一种将间歇性失败的测试放入隔离区以供以后处理的方法(如Martin Fowler 在此处所述 ). 随着越来越 ...

  3. IDEA - 解决“idea 环境:junit:4.11 测试 mybatis 代码,无法导入 org.junit.Test 包”问题

    IDEA - 解决"idea 环境:junit:4.11 测试 mybatis 代码,无法导入 org.junit.Test 包"问题 参考文章: (1)IDEA - 解决&quo ...

  4. springboot集成Junit在执行测试类的时候提示Failed to resolve异常

    项目场景:springboot集成Junit在执行测试类的时候提示Failed to resolve异常 项目场景:springboot版本2.5.7,Junit版本:4.13.2,在执行测试类的时候 ...

  5. Junit之Test测试

    Junit之Test测试 Junit使用:首先需要导入Junit的jar包. 使用方式:在方法前加@Test注解 import org.junit.Test;public class junitTes ...

  6. junit集成Hamcrest测试集合中某个属性是否包含特定值

    junit已经集成Hamcrest但是还是需要引用hamcrest-library,不然只有基本方法,高级的没有 <dependency> <groupId>junit< ...

  7. junit 单元测试 - 参数化测试

    junit4.x版本需要引入如下jar包: hamcrest-core-1.3.jar junit-4.12-beta-3.jar 新建一个计算器类,如下: package com.pt;public ...

  8. Junit 多线测试 问题

    问题 在使用Junit测试时,发现在测试方法中启动新的线程,结果新开启的线程未执行,测试方法就结束了.难道Junit不支持多线程测试? 示例如下: public class ThreadTest {@ ...

  9. JUnit 5 –参数化测试

    JUnit 5令人印象深刻,尤其是当您深入研究扩展模型和体系结构时 . 但是从表面上讲,编写测试的地方,开发的过程比革命的过程更具进化性 – JUnit 4上没有杀手级功能吗? 幸运的是,至少有一个: ...

  10. Spring 3使用JUnit 4进行测试– ContextConfiguration和AbstractTransactionalJUnit4SpringContextTests...

    在Internet上寻找一种测试我的Spring 3应用程序的方法,我找到了许多描述如何使用JUnit测试应用程序的文章. 它们中的大多数都是不完整的示例,实际上并不起作用. 在这篇文章中,我将尝试填 ...

最新文章

  1. LeetCode-240 Search a 2D Matrix II
  2. 2021-05-15
  3. VMWare下窗口大小调整
  4. 用回溯法求子集和的c++代码
  5. php array sum 小数位,多维数组上的PHP Array_Sum
  6. C语言数据类型大小分析(基于VC2005编译器)
  7. 数字图像处理 色差计算
  8. Cron 定时任务表达式
  9. 云计算机盒子,网络盒子秒变PC电脑必备装备客厅云电脑
  10. polygraph初体验
  11. Intel出品开源图片标注工具CVAT在Ubuntu18.04上部署
  12. 关于信息墒与压缩编码基础的学习
  13. 如何评估互联网广告效果
  14. 机器学习实战(Machine Learning in Action)学习笔记————04.朴素贝叶斯分类(bayes)...
  15. Unity3D模型中的SubMesh
  16. 阿里云服务器ICP备案流程概述
  17. 面试的时候怎样自我介绍更有效果?
  18. 12 行列式01--- 定义、计算 与性质: n级行列式的性质、行列式计算
  19. 国内链改思路是什么?
  20. JAVAEE真实课堂系列之javaScript全讲-刘志远-专题视频课程

热门文章

  1. VPC Peering 具有特定路由的配置
  2. 基于ARM64架构飞腾2000CPU的浪潮CE3000F机器安装银河麒麟系统和Docker
  3. 解决Win10/Win11输入法卡顿问题
  4. python怎么打开cmd-python中调用cmd
  5. win7打开xp共享的计算机,xp/win7局域网共享软件
  6. matlab函数表达式里分号_matlab中分号
  7. python里的平方_python中的平方
  8. 大数据管理平台-数据处理与数据集市
  9. 如何取消html中页眉的下划线,Word文档页眉的横线怎么去掉?页脚的横线怎么去掉?...
  10. mysql清理碎片_清除MySQL表空间碎片详细方法