前言

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的使用的更多相关文章

  1. TweenMax动画库学习(五)

    目录            TweenMax动画库学习(一)            TweenMax动画库学习(二)            TweenMax动画库学习(三)            Tw ...

  2. SVG 学习<五> SVG动画

    目录 SVG 学习<一>基础图形及线段 SVG 学习<二>进阶 SVG世界,视野,视窗 stroke属性 svg分组 SVG 学习<三>渐变 SVG 学习<四 ...

  3. Android JNI学习(五)——Demo演示

    本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...

  4. ZigBee学习五 无线温度检测

    ZigBee学习五 无线温度检测 1)修改公用头文件GenericApp.h typedef union h{ uint8 TEMP[4]; struct RFRXBUF { unsigned cha ...

  5. (转)MyBatis框架的学习(五)——一对一关联映射和一对多关联映射

    http://blog.csdn.net/yerenyuan_pku/article/details/71894172 在实际开发中我们不可能只是对单表进行操作,必然要操作多表,本文就来讲解多表操作中 ...

  6. cesium 学习(五) 加载场景模型

    cesium 学习(五) 加载场景模型 一.前言 现在开始实际的看看效果,目前我所接触到基本上都是使用Cesium加载模型这个内容,以及在模型上进行操作.So,现在进行一些加载模型的学习,数据的话可以 ...

  7. PowerMock学习之PoweMock的入门(二)

    前言 在上一篇<PowerMock学习之PoweMock的入门(一)>文章中,已经简单提及一些关于powermock的用法,但是入门还未完,我还要坚持把它学习并坚持更新到博客中. Mock ...

  8. Python基础学习五

    Python基础学习五 迭代 for x in 变量: 其中变量可以是字符串.列表.字典.集合. 当迭代字典时,通过字典的内置函数value()可以迭代出值:通过字典的内置函数items()可以迭代出 ...

  9. C语言程序设计入门学习五步曲(转发)

    笔者在从事教学的过程中,听到同学抱怨最多的一句话是:老师,上课我也能听懂,书上的例题也能看明白,可是到自己动手做编程时,却不知道如何下手.发生这种现象的原因有三个: 一.所谓的看懂听明白,只是很肤浅的 ...

随机推荐

  1. Spring Data - Spring Data JPA 提供的各种Repository接口

    Spring Data Jpa 最近博主越来越懒了,深知这样不行.还是决定努力奋斗,如此一来,就有了一下一波复习 演示代码都基于Spring Boot + Spring Data JPA 传送门: 博 ...

  2. 了解这一行的,腰包都鼓鼓的了,程序辅导,CS作业

    我们都知道计算机这类理科专业,可能你打开电脑聊几分钟微信,可能你就已经错过了成为程序员大佬的机会.就像数学专业的同学弯腰捡了一支笔,然后发现黑板被写满从此再也没有学懂数学.所以课后的作业自然也就没法顺 ...

  3. 拨云见日,彻底弄清楚Java日志框架 log4j, logback, slf4j的区别与联系

    log4j 以及 logback, slf4j 官网 日志框架的困惑 作为一个正常的项目,是必须有日志框架的存在的,没有日志,很难追踪一些奇奇怪怪的系统问题. 但是,我们经常在项目的依赖中,见到奇奇怪 ...

  4. Spring(二)装配Spring Bean

    控制反转的概念:控制反转是一种通过描述(在Java中或者是XML或者注解)并通过第三方去产生或获取特定对象的方式. 在Spring中实现控制反转的是IoC容器,其实现方法是依赖注入(Dependenc ...

  5. Android H5混合开发(2):自定义Cordova插件

    前言 Cordova虽然定义了很多基础的插件,供H5端使用原生设备的功能. 但是,如果业务相关的功能,需要提供给H5端使用,那么,就需要我们自定义插件了. 这个"自定义"不是指由A ...

  6. uWSGI+django+nginx 的工作原理流程与部署历程

    一.前言 献给和我一样懵懂中不断汲取知识,进步的人们. 霓虹闪烁,但人们真正需要的,只是一个可以照亮前路的烛光 二.必要的前提 2.1 准备知识 django 一个基于python的开源web框架,请 ...

  7. CSPS模拟 75

    我身边 mikufun:矩阵树学学学 Lrefrain:矩阵题刷刷刷 Dybala:神仙定理康康康 skyh:讨论讨论讨论(most mei face) DeepinC:我过样例了! Mouding: ...

  8. CSPS模拟 48

    ??? 分数越来越低??? T1 String Master 题目过于毒瘤,以至于我都不想改 T2 Tourist Attractions 稍微转化题意是求无向图的三角形个数 由于坚信bitset不是 ...

  9. PHP 导出微信公众号粉丝的方法

    PHP 导出微信公众号粉丝的方法 先 user/get 获取关注者列表 然后user/info 根据openid读取信息 以上方法认证的订阅号支持

  10. vmware centos共享文件夹

    vmware centos共享文件夹 查看VMware Tools 是否安装成功 <pre>vmware-hgfsclient</pre> 出现共享文件夹<pre> ...