转载:http://blog.csdn.net/u012881904/article/details/51334747

  1. 我们的依赖的配置
<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>
  1. 使用的场景 
    在现实的软件开发过程中,我们经常需要协同其他同事一起来完成某个模块的功能开发,或者需要第三方资源,比如您需要一个短信网关,您需要一个数据库,您需要一个消息中间件,当您进行测试依赖于这些资源的代码时候,不可能在每次都具备相应的环境,这将是一个很不现实的问题,如果当您依赖于其他模块而无法进行单元测试的时候,此时该模块的质量风险就有两个,第一是您所负责的代码,第二是您所依赖的代码,您所依赖您没有办法在很快的时间协调到资源, 那么您所负责的代码由于不具备单元测试环境没有办法进行测试,很可能存在极大的风险,因此如何测试您的代码,让他的质量达到百分之百的可用, 这就是 Mock 存在的必要。我们如何在没有数据库的时候能够测试我们的 Service,进行支付的测试等等,这才是 Mock 要解决的问题PowerMock(PowerMock 也是一种 Mock,但是他主要是解决其他 Mock 不能解决的问题)

在做单元测试的时候,我们会发现我们要测试的方法会引用很多外部依赖的对象,比如:(发送邮件,网络通讯,远程服务, 文件系统等等)。 而我们没法控制这些外部依赖的对象,为了解决这个问题,我们就需要用到Mock工具来模拟这些外部依赖的对象,来完成单元测试。

今天我在测试的时候,需要一个HttpResponse对象哦~怎么办呢?只有模拟这个对象啦!不知道可以不~~

  1. 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的简单的介绍相关推荐

  1. matlab整型和浮点的区别,技术帖 | 心理学MATLAB初学者教程--简单数据类型介绍(逻辑型数据,整型/浮点型数据,字符型)......

    1.2.1 什么是变量和变量名 变量这个词似乎在许多地方都有出现,在计算机中变量是指是一段有名字的连续存储空间(摘自百度百科),而这个所谓的名字就叫做变量名.举个例子说现在我们再MATLAB的命令窗口 ...

  2. 拨测工具_您可以拨多少钱? 快速简单地介绍有用的工具。

    拨测工具 by Miguel Bustamante 通过Miguel Bustamante 您可以卷曲多少? 快速简单地介绍有用的工具. (How much can you cURL? A quick ...

  3. tcpdump的简单选项介绍

    tcpdump采用命令行方式,它的命令格式为: tcpdump [ -AdDeflLnNOpqRStuUvxX ] [ -c count ] [ -C file_size ] [ -F file ] ...

  4. eve模拟器华为镜像_EVE-NG简单入门介绍

    此篇文章简单的介绍下模拟器EVE-NG的使用,具体包括Dynamips设备导入与运行,IOL设备的导入与运行,QEMU设备的导入与运行,客户端软件的安装,物理网络与虚拟网络的结合等. 一.导入镜像 D ...

  5. linux学习-简单命令介绍及安装VMware Tools

    常用简单命令介绍 ethernet以太网 pts:模拟终端 图形界面: Ctrl+Alt+F1 字符界面:Ctrl+Alt+F2-F6 切换虚拟终端:(本机操作) # chvt 1-6 关闭图形界面, ...

  6. CSS实验案例02简单专业介绍网页

    文章目录 CSS实验案例02简单专业介绍网页 2.1CSS 2.2HTML CSS实验案例02简单专业介绍网页 2.1CSS body {/* 主体*/font-size: 24px;text-ali ...

  7. linux下录音识别成文字软件,如何将录音转换成文字?录音转文字简单方法介绍...

    如何将录音转换成文字?录音转文字简单的方法是什么?很多小伙伴对录音转文字,文字阿欢语音方便的需求还是蛮大的,因为它对我们的帮助还是蛮大的,可以快速把录制好的录音转换成文字,并且还有实时翻译功能,下面给 ...

  8. PDF是如何在线分割的?简单方法介绍

    PDF在线分割的简单方法介绍,我们是怎么在线分割的呢?在PDF文件中我们可以进行文件的分割,下面小编就简单给打击介绍一下将PDF文件在线分割的方法. PDF文件在线分割的简单方法是直接在线分割,可以进 ...

  9. linux 运行eve,EVE-NG简单入门介绍

    此篇文章简单的介绍下模拟器EVE-NG的使用,具体包括Dynamips设备导入与运行,IOL设备的导入与运行,QEMU设备的导入与运行,客户端软件的安装,物理网络与虚拟网络的结合等. 导入镜像 Dyn ...

最新文章

  1. 一文读懂 CNN、DNN、RNN 内部网络结构区别
  2. linux solusos 软件包管理工具 eopkg 简介
  3. 基于Kubernetes构建Docker集群管理详解
  4. 基础知识(十六)Opencv、python、ubuntu
  5. linux 显示文件多少行
  6. 利用matlab进行Vissim二次开发,史上最详细
  7. SW2017学习笔记(一)基本的工作界面及鼠标操作
  8. 中药的专利标准化研究
  9. Android虚拟机多开检测
  10. 058.克鲁斯卡尔(Kruskal)算法的原理以及解决最小生成树问题
  11. Sklearn 中的可用数据集
  12. Spark数据倾斜解决
  13. OSF Jonathan Bryce:Open Infrastructure开启开放协作新时代
  14. Appium 连接夜神模拟器并启动
  15. fbx sdk android,FBX SDK环境配置
  16. vue 中 highcharts 的简单使用
  17. 小火狐进化_《乐贝星空》宠物大全 解析小火狐三阶进化
  18. 列车运行图的编制原则是什么_列车运行图的编制有什么要求?
  19. 读书笔记--《初等数论(第三版)》(闵嗣鹤 严士健 编)第一章 整数可除性(上)
  20. Writer——Writer的基本概念

热门文章

  1. win7 安装PyTorch
  2. Aim Controller:所有游戏都支持的PSVR
  3. MetaHuman效果炸了!但如果只想到元宇宙,那格局有点小了
  4. 科创板首发过会,格灵深瞳“三变”交出IPO答卷
  5. 互联网之父公开拍卖万维网源代码,3400万买下后发现居然有bug
  6. 时隔3年,华为又有人入选IEEE Fellow
  7. PPDE英雄帖!广邀全球开发者执开源之桨,汇百川成海
  8. 只需2小时,成本不到7块,你我皆可制作的3D机器人
  9. 教育部:全国高考延期一个月,湖北北京再行决定
  10. 起底华为计算战略:十五年研发下苦功,三年连发10芯加速,目前2万工程师奋战...