PowerMock学习(五)之Verifying的使用
前言
Verifying是一个非常强大的测试工具,在mock系列框架中使用广泛,主要用于验证方法是否被调用,下面将举例说明。
场景
模拟这样一个场景,通过Dao查询学生,如果存在更新原来学生,不存在则创建一个学生。
1、先来创建dao层的代码,具体示例代码如下:
package com.rongrong.powermock.verifying; /**
* @author rongrong
* @version 1.0
* @date 2019/11/26 20:56
*/
public class StudentVerifyDao { public int getStudentCount(Student student) {
throw new UnsupportedOperationException();
} public void saveStudent(Student student) {
throw new UnsupportedOperationException();
} public void updateStudent(Student student) {
throw new UnsupportedOperationException();
} }
2、接着我们再来编写,service层的代码,具体示例代码如下:
package com.rongrong.powermock.verifying; import org.junit.Test; /**
* @author rongrong
* @version 1.0
* @date 2019/11/26 21:05
*/
public class StudentVerifyService { public void saveOrUpdate(Student student) {
final StudentVerifyDao verifyDao = new StudentVerifyDao();
int count = verifyDao.getStudentCount(student);
if (count > 0) {
verifyDao.updateStudent(student);
} else {
verifyDao.saveStudent(student);
}
} @Test
public void test(){
StudentVerifyService verifyService = new StudentVerifyService();
verifyService.saveOrUpdate(new Student());
}
}
3、接着来做个简单的单元测试,也可以说是调用吧,这段代码运行是必须报错的,这里就不做解释,为什么报错了,代码如下:
@Test
public void test(){
StudentVerifyService verifyService = new StudentVerifyService();
verifyService.saveOrUpdate(new Student());
}
直接运行,报错如下图所示:

4、使用powermock来测试,具体代码如下:
package com.rongrong.powermock.verifying; import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner; /**
* @author rongrong
* @version 1.0
* @date 2019/11/26 22:05
*/
@RunWith(PowerMockRunner.class)
//提前将StudentVerifyService这个类准备好
@PrepareForTest(StudentVerifyService.class)
public class TestStudentVerifyService { @Test
public void testStudentLessThanZero(){
//mock一个假对象
StudentVerifyDao studentVerifyDao = PowerMockito.mock(StudentVerifyDao.class);
//mock对象构造过程
try {
PowerMockito.whenNew(StudentVerifyDao.class).withNoArguments().thenReturn(studentVerifyDao);
Student student = new Student();
//模拟当调用查询学生个数时候,没有找到,我给了0
PowerMockito.when(studentVerifyDao.getStudentCount(student)).thenReturn(0);
StudentVerifyService studentVerifyService = new StudentVerifyService();
//调用保存并更新方法
studentVerifyService.saveOrUpdate(student);
//没有那么走的就是保存方法啦
Mockito.verify(studentVerifyDao).saveStudent(student);
//这里就不走更新了,所以用了mockito.never()方法
Mockito.verify(studentVerifyDao,Mockito.never()).updateStudent(student);
} catch (Exception e) {
e.printStackTrace();
}
} @Test
public void testStudentMoreThanZero(){
//mock一个假对象
StudentVerifyDao studentVerifyDao = PowerMockito.mock(StudentVerifyDao.class);
Student student = new Student();
try {
//mock对象构造过程即局部变量构造
PowerMockito.whenNew(StudentVerifyDao.class).withNoArguments().thenReturn(studentVerifyDao);
//模拟调用查询学生存在,那么返回值给1即可
PowerMockito.when(studentVerifyDao.getStudentCount(student)).thenReturn(1);
StudentVerifyService studentVerifyService = new StudentVerifyService();
//调用保存并更新方法
studentVerifyService.saveOrUpdate(student);
//如果存在,这里要去更新学生信息
Mockito.verify(studentVerifyDao).updateStudent(student);
//Mockito.never()后就不会走保存的方法了
Mockito.verify(studentVerifyDao,Mockito.never()).saveStudent(student);
} catch (Exception e) {
e.printStackTrace();
}
}
}
直接运行,你会发现,运行通过,如下图所示:

总结
1、仔细看,在service中有个局部变量,这也就注定了我们只能使用powermock来测试
2、当有Mockito.never()出现的时候当前修饰行的方法将不被执行
3、这块应用的事mock局部变量的方法的使用,只是加了些方法后,变得复杂看似,但实际并不复杂,还请感兴趣的朋友,反复实践。
PowerMock学习(五)之Verifying的使用的更多相关文章
- TweenMax动画库学习(五)
目录 TweenMax动画库学习(一) TweenMax动画库学习(二) TweenMax动画库学习(三) Tw ...
- SVG 学习<五> SVG动画
目录 SVG 学习<一>基础图形及线段 SVG 学习<二>进阶 SVG世界,视野,视窗 stroke属性 svg分组 SVG 学习<三>渐变 SVG 学习<四 ...
- Android JNI学习(五)——Demo演示
本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...
- ZigBee学习五 无线温度检测
ZigBee学习五 无线温度检测 1)修改公用头文件GenericApp.h typedef union h{ uint8 TEMP[4]; struct RFRXBUF { unsigned cha ...
- (转)MyBatis框架的学习(五)——一对一关联映射和一对多关联映射
http://blog.csdn.net/yerenyuan_pku/article/details/71894172 在实际开发中我们不可能只是对单表进行操作,必然要操作多表,本文就来讲解多表操作中 ...
- cesium 学习(五) 加载场景模型
cesium 学习(五) 加载场景模型 一.前言 现在开始实际的看看效果,目前我所接触到基本上都是使用Cesium加载模型这个内容,以及在模型上进行操作.So,现在进行一些加载模型的学习,数据的话可以 ...
- PowerMock学习之PoweMock的入门(二)
前言 在上一篇<PowerMock学习之PoweMock的入门(一)>文章中,已经简单提及一些关于powermock的用法,但是入门还未完,我还要坚持把它学习并坚持更新到博客中. Mock ...
- Python基础学习五
Python基础学习五 迭代 for x in 变量: 其中变量可以是字符串.列表.字典.集合. 当迭代字典时,通过字典的内置函数value()可以迭代出值:通过字典的内置函数items()可以迭代出 ...
- C语言程序设计入门学习五步曲(转发)
笔者在从事教学的过程中,听到同学抱怨最多的一句话是:老师,上课我也能听懂,书上的例题也能看明白,可是到自己动手做编程时,却不知道如何下手.发生这种现象的原因有三个: 一.所谓的看懂听明白,只是很肤浅的 ...
随机推荐
- 阿里巴巴开源故障注入工具_chaosblade
chaosblade是阿里巴巴最近开源的一款故障注入的工具,因为我最近在做公司的虚拟化平台的可靠性测试工具,无意中发现这个工具,个人感觉比较有用,用起来也比较简单,所以拿出来分享一下,期望对大家的工作 ...
- 微信小程序文件压缩上传
试用场景:上传图片过大,需进行压缩处理. 涉及微信API API 说明 文档 chooseImage 选择图片 https://developers.weixin.qq.com/miniprogram ...
- 使用cordova + vue搭建混合app框架
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/zxj0904010228/article ...
- solr学习篇(三) solr7.4 连接MySQL数据库
目录 导入相关jar包 配置连接信息 将数据库导入到solr中 验证是否成功 创建一个Core,创建Core的方法之前已经很详细的讲解过了,如果还是不清楚请参考 solr7.4 安装配置篇: 1.导入 ...
- (一)初识EasyTouch
Easy Touch是一个手指触控(可以鼠标)的插件,可以非常方便的实现各种功能,使用插件第一步是添加Easy Touch组件,可以右键添加也可以在一个空的游戏物体上添加Easy Touch脚本(非事 ...
- 洛谷P3121 【[USACO15FEB]审查(黄金)Censoring (Gold)】
双栈+AC自动机 这题其实跟一道KMP算法的题有一些渊源,它就是这道题的简单板. Clear: 给你两个串A,B,每次在B串中从左到右找串A,并将该子串删除,直到找不到为止,问你能删几次. 样例输入: ...
- K近邻(k-Nearest Neighbor,KNN)算法,一种基于实例的学习方法
1. 基于实例的学习算法 0x1:数据挖掘的一些相关知识脉络 本文是一篇介绍K近邻数据挖掘算法的文章,而所谓数据挖掘,就是讨论如何在数据中寻找模式的一门学科. 其实人类的科学技术发展的历史,就一直伴随 ...
- NOIP模拟 19
最近试考的脑壳疼 晚上还有一场555 T1 count 研究性质题. 研究好了AC,研究不明白就没头绪 首先枚举n的因子d 其次发现因为是树,所以如果合法,贡献只能是1 然后发现如果合法,一定是一棵一 ...
- 国际C语言混乱代码大赛优胜作品详解之“A clock in one line”
原文链接:https://blog.csdn.net/herorenme/article/details/8864351 摘要:IOCCC,即国际混乱C语言代码大赛是一项著名的国际编程赛事迄今已举办2 ...
- 014.Kubernetes二进制部署docker
一 部署docker 1.1 部署docker组件 docker 运行和管理容器,kubelet 通过 Container Runtime Interface (CRI) 与它进行交互. 1.2 下载 ...