PowerMock学习(一)之PoweMock的入门--模拟新增学生操作
关于powermock
在TDD领域Mock框架有很多,比如EasyMock,JMock,Mockito。可能有些同学会好奇了,为什么要重点把powermock拿出来呢,因为powermock可以解决前面三种框架不能解决的问题,而且powermock也是是单元测试中极其强大的测试框架。
powermock特点
- 主要围绕着Junit、TestNg测试框架开展进行
- 对所依赖的Jar包非常的苛刻,出现jar包的冲突或者不一致就不能使用
- PowerMock也是一种Mock,主要是解决其他Mock不能解决的问题,通俗的讲,就是专治各种不服
powermock入门实例
1、引入依赖jar包
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>1.6.1</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito</artifactId>
<version>1.6.1</version>
<scope>compile</scope>
</dependency>
2、实际案例
模拟场景:新增学生操作
先建一个名为StudentService的类,用来模拟服务调用操作,在这个类中新增一个方法,来模拟查询总共有多少个学生。
具体示例代码如下:
package com.rongrong.powermock.service; import com.rongrong.powermock.dao.StudentDao; /**
* @author rongrong
* @version 1.0
* @date 2019/11/17 21:13
*/
public class StudentService {
private StudentDao studentDao; public StudentService(StudentDao studentDao) {
this.studentDao = studentDao;
} /**
* 获取学生个数
*
* @param studentDao
*/
public int getTotal(StudentDao studentDao) {
return studentDao.getTotal();
}
}
可以看出创建service需要传递StudentDao这个类,接着我们再来创建StudentDao这个类,用于进行新增操作。
具体示例代码如下:
package com.rongrong.powermock.dao; /**
* @author rongrong
* @version 1.0
* @date 2019/11/17 21:15
*/
public class StudentDao {
public int getTotal() {
throw new UnsupportedOperationException();
}
}
仔细看,你会发现,你肯定调不了dao了,这回傻了吧,哈哈哈!!!
你会好奇这块为啥我要抛出UnsupportedOperationException异常呢,因为我就想模拟服务不可用的情况(实际中经常会遇到可能由于某种原因(没有完成,或者资源不存在等)无法为 Service 服务),这样的情况,难道我们就不测试了吗?
那我还是乖乖的把测试用例写完,并测试下吧,下面我们再来创建一个名为StudentServiceTest的测试类。
具体示例代码如下:
package com.rongrong.powermock.service; import com.rongrong.powermock.dao.StudentDao;
import org.testng.annotations.Test; /**
* @author rongrong
* @version 1.0
* @date 2019/11/17 21:19
*/
public class StudentServiceTest {
@Test
public void testAddStudent() {
StudentDao studentDao = new StudentDao();
StudentService studentService = new StudentService(studentDao);
studentService.getTotal(studentDao);
} }
上面的测试用例肯定会执行失败,那我们也来执行下看,效果如下图:

我们先将这个报错,脑补为链接不上数据库,问题很明显,数据库挂了,就是连接不上了,等着服务器好了得三天后,可是今晚领导就要看功能实现,你该怎么办?无法测试service,难道就真的结束了吗?
答案是否定的,此时我们用powermock便可完美解决问题,接下来我们请出powermock登场。
具体代码如下:
package com.rongrong.powermock.service; import com.rongrong.powermock.dao.StudentDao;
import org.powermock.api.mockito.PowerMockito;
import org.testng.Assert;
import org.testng.annotations.Test; /**
* @author rongrong
* @version 1.0
* @date 2019/11/17 21:19
*/
public class StudentServiceTest { @Test
public void testGetStudentTotal() {
StudentDao studentDao = PowerMockito.mock(StudentDao.class);
PowerMockito.when(studentDao.getTotal()).thenReturn(666);
StudentService studentService = new StudentService(studentDao);
int total = studentService.getTotal(studentDao);
Assert.assertEquals(total, 666);
} }
这时再次运行,你会发现神奇般的运行通过,结果如下图所示:

是不是很神奇,很惊喜,没错,这个框架就是这么强大。
我们可以这样理解mock就是创建一个假的该对象,然后需要你告诉这个对象调用某个方法的时候返回某个你指定的值即可。
到此,一个简单powermock入门结束,如您觉得好,请继续关注我,谢谢支持!
PowerMock学习(一)之PoweMock的入门--模拟新增学生操作的更多相关文章
- PowerMock学习之PoweMock的入门(二)
前言 在上一篇<PowerMock学习之PoweMock的入门(一)>文章中,已经简单提及一些关于powermock的用法,但是入门还未完,我还要坚持把它学习并坚持更新到博客中. Mock ...
- SSM(spring mvc+spring+mybatis)学习路径——1-1、spring入门篇
目录 1-1 Spring入门篇 专题一.IOC 接口及面向接口编程 什么是IOC Spring的Bean配置 Bean的初始化 Spring的常用注入方式 专题二.Bean Bean配置项 Bean ...
- JS做深度学习1——偶然发现与入门
JS做深度学习1--偶然发现与入门 不久前,我初次涉猎了Node.js,并且使用它开发了毕业设计的WEB模块,然后通过在Node中调用系统命令执行Python文件方式实现了深度学习功能模块的对接,Py ...
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- IT技术学习指导之Linux系统入门的4个阶段(纯干货带图)
IT技术学习指导之Linux系统入门的4个阶段(纯干货带图) 全世界60%的人都在使用Linux.几乎没有人没有受到Linux系统的"恩惠",我们享受的大量服务(包括网页服务.聊天 ...
- JavaWeb学习总结(一)——JavaWeb开发入门
http://www.cnblogs.com/xdp-gacl/p/3729033.html 只为成功找方法,不为失败找借口! JavaWeb学习总结(一)--JavaWeb开发入门 一.基本概念 1 ...
- jQuery学习笔记 - 基础知识扫盲入门篇
jQuery学习笔记 - 基础知识扫盲入门篇 2013-06-16 18:42 by 全新时代, 11 阅读, 0 评论, 收藏, 编辑 1.为什么要使用jQuery? 提供了强大的功能函数解决浏览器 ...
- 【转】MyBatis学习总结(一)——MyBatis快速入门
[转]MyBatis学习总结(一)——MyBatis快速入门 一.Mybatis介绍 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC ...
- Oracle RAC学习笔记:基本概念及入门
Oracle RAC学习笔记:基本概念及入门 2010年04月19日 10:39 来源:书童的博客 作者:书童 编辑:晓熊 [技术开发 技术文章] oracle 10g real applica ...
随机推荐
- Vue学习系列(二)——组件详解
前言 在上一篇初识Vue核心中,我们已经熟悉了vue的两大核心,理解了Vue的构建方式,通过基本的指令控制DOM,实现提高应用开发效率和可维护性.而这一篇呢,将对Vue视图组件的核心概念进行详细说明. ...
- CentOS 7.7版本中NAT上网问题
一.NAT(地址转换模式)概念 如果你的网络ip资源紧缺,但是你又希望你的虚拟机能够联网,这时候NAT模式是最好的选择.NAT模式借助虚拟NAT设备和虚拟DHCP服务器,使得虚拟机可以联网. 二.具体 ...
- 程序猿的产品思考:2C与2B产品思维的区别
原创/朱季谦 我最早接触到互联网产品的时候,听到最多的,是做产品要有用户思维,即站在用户角度去看待产品.这个先入为主的概念,在很长一段时间里,都被我效作经典.然而也在很长一段时间里,我竟混淆了其中 ...
- opencv::轮廓发现(find contour in your image)
轮廓发现(find contour) 轮廓发现是基于图像边缘提取的基础寻找对象轮廓的方法. 所以边缘提取的阈值选定会影响最终轮廓发现结果 //发现轮廓 cv::findContours( InputO ...
- cmd 获取当前登录的用户和远程连接的用户
打开cmd 执行 quser 可以看到我有两个 会话 带> 是我当前的会话 rdp 是远程连接的会话 console 是本机操作 可以知道谁在连接你 状态是 唱片 就是未连接的意思 ...
- 手动部署 Docker+Grafana+Prometheus系统监控之Redis
监控规划图 使用Docker 创建两台Redis docker run -d --name redis1 redis docker run -d --name redis2 redis 查看redis ...
- 将windows项目移植到linux上
提要:由于项目使用java开发,移植中没有什么编译问题(移植很快,但小问题多) 1.移植过程中遇到的问题: (1).由于项目中使用了 1024以下的端口号,导致网络通信一直出错 原因:因为Linux要 ...
- 推荐一款现代化的脚手架项目《hope-boot》
简介: > 一款现代化的脚手架项目.企业开发?接外包?赚外快?还是学习?这都能满足你,居家必备,值得拥有
- (day28)操作系统发展史+进程
目录 一.操作系统发展史 (一)穿孔卡片(手工操作) (二)批处理系统(磁带存储) 1. 联机批处理系统 2. 脱机批处理系统 (三)多道技术 二.进程 (一)程序和进程 (二)进程调度 1. 先来先 ...
- OptimalSolution(5)--数组和矩阵问题(1)简单
一.转圈打印矩阵 题目:给定一个整型矩阵matrix,按照转圈的方式打印它. 要求:额外空间复杂度为O(1) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 打印结果为: ...