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语言程序设计入门学习五步曲(转发)
笔者在从事教学的过程中,听到同学抱怨最多的一句话是:老师,上课我也能听懂,书上的例题也能看明白,可是到自己动手做编程时,却不知道如何下手.发生这种现象的原因有三个: 一.所谓的看懂听明白,只是很肤浅的 ...
随机推荐
- Spring Boot构建的Web项目如何在服务端校验表单输入
本文首发于个人网站:Spring Boot构建的Web项目如何在服务端校验表单输入 这个例子用于演示在Spring Boot应用中如何验证Web 应用的输入,我们将会建立一个简单的Spring MVC ...
- Mysql高手系列 - 第27篇:mysql如何确保数据不丢失的?我们借鉴这种设计思想实现热点账户高并发设计及跨库转账问题
Mysql系列的目标是:通过这个系列从入门到全面掌握一个高级开发所需要的全部技能. 欢迎大家加我微信itsoku一起交流java.算法.数据库相关技术. 这是Mysql系列第27篇. 本篇文章我们先来 ...
- Spring Boot 配置 - 配置信息加密
▶ Spring Boot 依赖与配置 Maven 依赖 <dependency> <groupId>org.springframework.boot</groupId& ...
- # webpack 打包工具(vue)
vue-webpack 打包工具 我的github iSAM2016 不是教程,是自我总结 目录 webpack.base.conf.js webpack.dev.conf.js webpack.pr ...
- HTTP协议与使用Python获取数据并写入MySQL
一.Http协议 二.Https协议 三.使用Python获取数据 (1)urlib (2)GET请求 (3)POST请求 四.爬取豆瓣电影实战 1.思路 (1)在浏览器中输入https://movi ...
- Flask解析(二):Flask-Sqlalchemy与多线程、多进程
Sqlalchemy flask-sqlalchemy的session是线程安全的,但在多进程环境下,要确保派生子进程时,父进程不存在任何的数据库连接,可以通过调用db.get_engine(app= ...
- Linux上安装mysql,实现主从复制
MYSQL(mariadb) MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可.开发这个分支的原因之一是:甲骨文公司收购了MySQL后,有将MySQL闭源的 ...
- 一个自动管理项目的Makefile(C语言)
Linux 是所有嵌入式软件工程师绕不过去的坎, makefile 是在Linux系统中绕不过去的坎. 花了几天时间初步学习和了解了makefile 的作用以及功能,并且制作了一个通用型的makefi ...
- C++学习笔记4_new和delete
1. 默认的new和delete操作符new和delete是和c里面的mlloc和free是一样的,在堆中创建空间.堆中创建的,都要自己释放.C中void test(){ int *p=(int *) ...
- 爬虫之scrapy简介
原始的爬虫流程:效率低.同步.阻塞 scrapy执行流程:效率高.异步.非阻塞 scrapy的概念 scrapy是一个爬虫框架 开发速度快 稳定性高 性能优越 scrapy的流程 1. 爬虫模块(Sp ...