PowerMockito的简单的介绍
转载:http://blog.csdn.net/u012881904/article/details/51334747
- 我们的依赖的配置
<properties><powermock.version>1.5.6</powermock.version> </properties> <dependencies> <dependency> <groupId>org.powermock</groupId> <artifactId>powermock-module-junit4</artifactId> <version>${powermock.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.powermock</groupId> <artifactId>powermock-api-mockito</artifactId> <version>${powermock.version}</version> <scope>test</scope> </dependency> </dependencies>
- 使用的场景
在现实的软件开发过程中,我们经常需要协同其他同事一起来完成某个模块的功能开发,或者需要第三方资源,比如您需要一个短信网关,您需要一个数据库,您需要一个消息中间件,当您进行测试依赖于这些资源的代码时候,不可能在每次都具备相应的环境,这将是一个很不现实的问题,如果当您依赖于其他模块而无法进行单元测试的时候,此时该模块的质量风险就有两个,第一是您所负责的代码,第二是您所依赖的代码,您所依赖您没有办法在很快的时间协调到资源, 那么您所负责的代码由于不具备单元测试环境没有办法进行测试,很可能存在极大的风险,因此如何测试您的代码,让他的质量达到百分之百的可用, 这就是 Mock 存在的必要。我们如何在没有数据库的时候能够测试我们的 Service,进行支付的测试等等,这才是 Mock 要解决的问题PowerMock(PowerMock 也是一种 Mock,但是他主要是解决其他 Mock 不能解决的问题)
在做单元测试的时候,我们会发现我们要测试的方法会引用很多外部依赖的对象,比如:(发送邮件,网络通讯,远程服务, 文件系统等等)。 而我们没法控制这些外部依赖的对象,为了解决这个问题,我们就需要用到Mock工具来模拟这些外部依赖的对象,来完成单元测试。
今天我在测试的时候,需要一个HttpResponse对象哦~怎么办呢?只有模拟这个对象啦!不知道可以不~~
- hello word 的使用!获取所有员工的个数
我们现在有一个 Service 类,就是 EmployeeService,其中有一个方法需要获取数据库中雇员的数量,Service 代码如下所示:
import com.wangwenjun.powermock.helloworld.dao.EmployeeDao;
public class EmployeeService { private EmployeeDao employeeDao; public EmployeeService(EmployeeDao employeeDao) { this.employeeDao = employeeDao; } /** * 获取所有员工的数量. * @return */ public int getTotalEmployee() { return employeeDao.getTotal(); } }
可以看到, 创建 Service 的时候需要传递一个 EmployeeDao 这个类, 也就是说 Service依赖于 Persistence,如果想要测试 Service 就需要完全看 Persistence 的脸色,我们再来看看 Persistence 代码,如下所示
public class EmployeeDao {public int getTotal() { throw new UnsupportedOperationException(); } }
哇!你死定了,你肯定调用不了 Dao,无法正常完成 Service 的测试,我为什么要在Persistence的方法抛出UnsupportedOperationException呢?目的就是告诉大家该方法可能由于某种原因(没有完成,或者资源不存在等)无法为 Service 服务,难道你不需要测试 EmployeeService 么?肯定要测试,那么我们就硬着头皮来写测试用例吧
import static org.junit.Assert.assertEquals;
import org.junit.Test;
import com.wangwenjun.powermock.helloworld.dao.EmployeeDao;
public class EmployeeServiceTest { @Test public void testGetTotalEmployee() { final EmployeeDao employeeDao = new EmployeeDao(); final EmployeeService service = new EmployeeService(employeeDao); int total = service.getTotalEmployee(); assertEquals(10, total); } }
比较的遗憾,这个肯定的会失败的哦~不会成功的,我们的Dao层的数据都还没有实现怎么可能会有好的数据返回呢?
所以啊,这个时候我们就模拟啊~,当我们的service层调用代码的时候,我们就可以使用啦!employeeDao.getTotal();
我们要去模拟这个方法的返回值,必须的去请求我们的返回的数据,这个时候就是模拟啦!
请大家忘记此时此刻我抛出来的异常,幻想成此时此刻数据库连接不上,问题现在很明显,数据库链接不通,我们无法测试 Service,难道真的就无计可施了么?好吧,有请我们的主角 PowerMock 闪亮登场,请看下面的测试用例
import org.junit.Test;
import org.powermock.api.mockito.PowerMockito; import com.wangwenjun.powermock.helloworld.dao.EmployeeDao; public class EmployeeServiceTest { @Test public void testGetTotalEmployeeWithMock() { EmployeeDao employeeDao = PowerMockito.mock(EmployeeDao.class); PowerMockito.when(employeeDao.getTotal()).thenReturn(10);//当我们调用这个方法的时候的返回值是10!这样就好了涩,我们不是就模拟出来啦数据啦~ EmployeeService service = new EmployeeService(employeeDao); int total = service.getTotalEmployee(); assertEquals(10, total); } }
当你再次运行时你会发现此时此刻运行通过, 编写一下上述的代码我们先来有个简单的认识,所谓 Mock 就是创建一个假的,Mock 那个对象就会创建一个假的该对象,此时该对象是一单纯的白纸,需要你对其进行涂鸦,第二句话 when…then 语法就是您的涂鸦, 您期望调用某个方法的时候返回某个您指定的值。完全让 EmployeeDao 根据你的意愿来运行,所以想怎样测试 EmployeeService 就怎样测试。
- 创建员工 返回值为void的测试!
我们再来增加另外一个需求,就是创建一个 Employee,这就意味着我们需要分别在Service 和 Dao 中增加相应的两个接口
Service 中的 CreateEmployee 方法
public void createEmployee(Employee employee)
{employeeDao.addEmployee(employee);
}再来看看 Dao 中的方法 addEmployee 没有返回值哦~由于某些原因呢,我们就是没得返回值啦~
public void addEmployee(Employee employee) { throw new UnsupportedOperationException(); }
因为此时“数据库资源不存在” ,相信大家一定很清楚这一点,但是这不是本小节中所要讲述的重点,重点在于 addEmployee 方法是一个 void类型的,也就是我们没有办法断言想要的结果是否一致,而 mock 厚的 addEmployee 方法事实上是什么都不会做的,此时我们该如何进行测试呢? 比如log记录日志…里面含有httpsession对象,我们也是可以不需要打印日志的,直接不管他啦!但是测试的时候我们不能把他直接注释掉啊!忘记了怎么办呢?这样的方式很不对!以前我测试的时候也是这么直接的处理的,实习呢之后的今天,看到了这个非常的好奇哦,还不错,学到了好东西!测试非常的有必要,比编写代码更重要。反正我写测试比编写代码的时间多!
简单思考一下我们其实只是想要知道 addEmployee 方法是否被调用过即可, 当然我们可以假设他 add 成功或者失败,这就根据您的 test case 来设定了,好了,有了这个概念之后我们来看看如何测试 void 方法,其实就是 mock 中一个很重要的概念 Verifying
@Test
public void testCreateEmployee() {EmployeeDao employeeDao = PowerMockito.mock(EmployeeDao.class);Employee employee = new Employee(); PowerMockito.doNothing().when(employeeDao).addEmployee(employee);//当我们使用这个方法的时候我们什么都不做哦,仅仅测试哈,是否调用了这个方法就好了! EmployeeService service = new EmployeeService(employeeDao); service.createEmployee(employee); // verify the method invocation. Mockito.verify(employeeDao).addEmployee(employee); }
然后用 junit 运行肯定能够通过, 其中 Mockito.verify 主要用来校验被 mock 出来的对象中的某个方法是否被调用,我们的 PowerMock helloworld 也到此结束了。
PowerMockito的简单的介绍相关推荐
- matlab整型和浮点的区别,技术帖 | 心理学MATLAB初学者教程--简单数据类型介绍(逻辑型数据,整型/浮点型数据,字符型)......
1.2.1 什么是变量和变量名 变量这个词似乎在许多地方都有出现,在计算机中变量是指是一段有名字的连续存储空间(摘自百度百科),而这个所谓的名字就叫做变量名.举个例子说现在我们再MATLAB的命令窗口 ...
- 拨测工具_您可以拨多少钱? 快速简单地介绍有用的工具。
拨测工具 by Miguel Bustamante 通过Miguel Bustamante 您可以卷曲多少? 快速简单地介绍有用的工具. (How much can you cURL? A quick ...
- tcpdump的简单选项介绍
tcpdump采用命令行方式,它的命令格式为: tcpdump [ -AdDeflLnNOpqRStuUvxX ] [ -c count ] [ -C file_size ] [ -F file ] ...
- eve模拟器华为镜像_EVE-NG简单入门介绍
此篇文章简单的介绍下模拟器EVE-NG的使用,具体包括Dynamips设备导入与运行,IOL设备的导入与运行,QEMU设备的导入与运行,客户端软件的安装,物理网络与虚拟网络的结合等. 一.导入镜像 D ...
- linux学习-简单命令介绍及安装VMware Tools
常用简单命令介绍 ethernet以太网 pts:模拟终端 图形界面: Ctrl+Alt+F1 字符界面:Ctrl+Alt+F2-F6 切换虚拟终端:(本机操作) # chvt 1-6 关闭图形界面, ...
- CSS实验案例02简单专业介绍网页
文章目录 CSS实验案例02简单专业介绍网页 2.1CSS 2.2HTML CSS实验案例02简单专业介绍网页 2.1CSS body {/* 主体*/font-size: 24px;text-ali ...
- linux下录音识别成文字软件,如何将录音转换成文字?录音转文字简单方法介绍...
如何将录音转换成文字?录音转文字简单的方法是什么?很多小伙伴对录音转文字,文字阿欢语音方便的需求还是蛮大的,因为它对我们的帮助还是蛮大的,可以快速把录制好的录音转换成文字,并且还有实时翻译功能,下面给 ...
- PDF是如何在线分割的?简单方法介绍
PDF在线分割的简单方法介绍,我们是怎么在线分割的呢?在PDF文件中我们可以进行文件的分割,下面小编就简单给打击介绍一下将PDF文件在线分割的方法. PDF文件在线分割的简单方法是直接在线分割,可以进 ...
- linux 运行eve,EVE-NG简单入门介绍
此篇文章简单的介绍下模拟器EVE-NG的使用,具体包括Dynamips设备导入与运行,IOL设备的导入与运行,QEMU设备的导入与运行,客户端软件的安装,物理网络与虚拟网络的结合等. 导入镜像 Dyn ...
最新文章
- 一文读懂 CNN、DNN、RNN 内部网络结构区别
- linux solusos 软件包管理工具 eopkg 简介
- 基于Kubernetes构建Docker集群管理详解
- 基础知识(十六)Opencv、python、ubuntu
- linux 显示文件多少行
- 利用matlab进行Vissim二次开发,史上最详细
- SW2017学习笔记(一)基本的工作界面及鼠标操作
- 中药的专利标准化研究
- Android虚拟机多开检测
- 058.克鲁斯卡尔(Kruskal)算法的原理以及解决最小生成树问题
- Sklearn 中的可用数据集
- Spark数据倾斜解决
- OSF Jonathan Bryce:Open Infrastructure开启开放协作新时代
- Appium 连接夜神模拟器并启动
- fbx sdk android,FBX SDK环境配置
- vue 中 highcharts 的简单使用
- 小火狐进化_《乐贝星空》宠物大全 解析小火狐三阶进化
- 列车运行图的编制原则是什么_列车运行图的编制有什么要求?
- 读书笔记--《初等数论(第三版)》(闵嗣鹤 严士健 编)第一章 整数可除性(上)
- Writer——Writer的基本概念
热门文章
- win7 安装PyTorch
- Aim Controller:所有游戏都支持的PSVR
- MetaHuman效果炸了!但如果只想到元宇宙,那格局有点小了
- 科创板首发过会,格灵深瞳“三变”交出IPO答卷
- 互联网之父公开拍卖万维网源代码,3400万买下后发现居然有bug
- 时隔3年,华为又有人入选IEEE Fellow
- PPDE英雄帖!广邀全球开发者执开源之桨,汇百川成海
- 只需2小时,成本不到7块,你我皆可制作的3D机器人
- 教育部:全国高考延期一个月,湖北北京再行决定
- 起底华为计算战略:十五年研发下苦功,三年连发10芯加速,目前2万工程师奋战...