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语言程序设计入门学习五步曲(转发)
笔者在从事教学的过程中,听到同学抱怨最多的一句话是:老师,上课我也能听懂,书上的例题也能看明白,可是到自己动手做编程时,却不知道如何下手.发生这种现象的原因有三个: 一.所谓的看懂听明白,只是很肤浅的 ...
随机推荐
- Yii2.0教程应用结构篇 —— 入口脚本
入口脚本是应用启动流程中的第一环,一个应用(不管是网页应用还是控制台应用)只有一个入口脚本.终端用户的请求通过入口脚本实例化应用并将将请求转发到应用. Web 应用的入口脚本必须放在终端用户能够访问的 ...
- redis之PubSub
前面我们讲了 Redis 消息队列的使用方法,但是没有提到 Redis 消息队列的不足之处,那就是它不支持消息的多播机制. 消息多播 消息多播允许生产者生产一次消息,中间件负责将消息复制到多个消息队列 ...
- zepto源码分析·event模块
准备知识 事件的本质就是发布/订阅模式,dom事件也不例外:先简单说明下发布/订阅模式,dom事件api和兼容性 发布/订阅模式 所谓发布/订阅模式,用一个形象的比喻就是买房的人订阅楼房消息,售楼处发 ...
- Python 中的for....else....
在一个for循环中,当循环遇到break语句之后程序就会跳出循环,执行for循环之后的语句:但是,当整个循环都没有遇上break语句,而且你想在这种情况下做一些事情的话,你就可以通过结合else来完成 ...
- Mysql数据库(二)Mysql数据库管理
一 .创建数据库 1.通过CREATE DATABASE db_library;创建名称为db_library的数据库. 2.通过CREATE SCHEMA db_library1;创建名称为db_l ...
- unity发布ios高通AR的问题
1)缺少引用,无法找到vuforiaBehavior 原因:Windows下的工程,直接考到mac下,导致unity自带插件(2017)有问题 解决:首先在playerSettings-xrSetti ...
- SpringBoot与MybatisPlus整合之活动记录(十五)
活动记录和正常的CRUD效果是一样的,此处只当一个拓展,了解即可 pom.xml <dependencies> <dependency> <groupId>org. ...
- Vue引入插件
引入Element ui 1.在当前目录下,运行:npm i element-ui -S 2.在src/main.js中添加代码 import ElementUI from 'element-ui' ...
- 指定路径批量将xls转换成csv
PS : 用到spire库,.net控制台应用程序 其实本来没打算写这个工具的,只是最近需要用到,手头上正好没有这样的工具,那么怎么办,写呗! 其实说白了就是省事,策划想怎么玩,把表把工具丢给他,省得 ...
- call 与apply深入
http://blog.csdn.net/bao19901210/article/details/21614761