关于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的入门--模拟新增学生操作的更多相关文章

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

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

  2. SSM(spring mvc+spring+mybatis)学习路径——1-1、spring入门篇

    目录 1-1 Spring入门篇 专题一.IOC 接口及面向接口编程 什么是IOC Spring的Bean配置 Bean的初始化 Spring的常用注入方式 专题二.Bean Bean配置项 Bean ...

  3. JS做深度学习1——偶然发现与入门

    JS做深度学习1--偶然发现与入门 不久前,我初次涉猎了Node.js,并且使用它开发了毕业设计的WEB模块,然后通过在Node中调用系统命令执行Python文件方式实现了深度学习功能模块的对接,Py ...

  4. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  5. IT技术学习指导之Linux系统入门的4个阶段(纯干货带图)

    IT技术学习指导之Linux系统入门的4个阶段(纯干货带图) 全世界60%的人都在使用Linux.几乎没有人没有受到Linux系统的"恩惠",我们享受的大量服务(包括网页服务.聊天 ...

  6. JavaWeb学习总结(一)——JavaWeb开发入门

    http://www.cnblogs.com/xdp-gacl/p/3729033.html 只为成功找方法,不为失败找借口! JavaWeb学习总结(一)--JavaWeb开发入门 一.基本概念 1 ...

  7. jQuery学习笔记 - 基础知识扫盲入门篇

    jQuery学习笔记 - 基础知识扫盲入门篇 2013-06-16 18:42 by 全新时代, 11 阅读, 0 评论, 收藏, 编辑 1.为什么要使用jQuery? 提供了强大的功能函数解决浏览器 ...

  8. 【转】MyBatis学习总结(一)——MyBatis快速入门

    [转]MyBatis学习总结(一)——MyBatis快速入门 一.Mybatis介绍 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC ...

  9. Oracle RAC学习笔记:基本概念及入门

    Oracle RAC学习笔记:基本概念及入门 2010年04月19日 10:39 来源:书童的博客 作者:书童 编辑:晓熊 [技术开发 技术文章]    oracle 10g real applica ...

随机推荐

  1. 由一次线上故障来理解下 TCP 三握、四挥 & Java 堆栈分析到源码的探秘

    本文导读: 生产故障场景介绍 TCP 建连三次握手过程 TCP 断连四次挥手过程 结合 Java 堆栈剖析源码 再从堆栈中找到"罪魁祸首" 问题优化方案总结 1.生产故障场景介绍 ...

  2. Oracle11g入门

    数据类型 数据类型 表示 数字 number 日期时间 date 字符串 char(长度)/varchar2(长度) 约束条件 名称 约束 唯一 unique 非空约束 not null 主键约束 p ...

  3. 上传漏洞之常见MIME类型

    常见的MIME类型 超文本标记语言文本 .html,.html text/html 普通文本 .txt text/plain RTF文本 .rtf application/rtf GIF图形 .gif ...

  4. shark恒破解笔记3-EAX决定胜负

    PEID查壳 od载入 输入假的注册码 查找出错字符串 往上查找是否有关键跳转和关键call 可以看到此处有个je跳转 实现了跳转,并且跳过了我们注册成功的地址 网上查找这个跳转的关键call,这个c ...

  5. node.js当中的http模块与url模块的简单介绍

    一.http模块的简单介绍 node.js当中的http内置模块可以用于创建http服务器与http客户端. 1.引包 const http = require('http'); 2.创建http服务 ...

  6. 记一次EF Core DBContext在Action委托中GC异常的问题.

    今天在开发过程中发现.在SaveChanges的时候偶尔会抛出异常:Cannot access a disposed object. A common cause of this error is d ...

  7. MySQL常用sql语句-----数据库操作

    在数据库操作中,操作基本都是围绕增删改查来操作.简称CRUD C创建创建 R读取/检索查询 U Update修改 D删除删除 在数操作数据库时,所有的数据库语句都要以分号结束 数据库操作不区分大小写 ...

  8. c#菜单动态合并

    说明 在程序中经常使用弹出菜单,并且一个窗体中可以存在多个弹出菜单.开发过MDI窗体的读者可能都知道,当MDI子窗体最大化时,子窗体和主窗体的菜单能够自动的合并.这是如何实现的呢?本例实现了将两个弹出 ...

  9. Azure DevOps 替换 appsettings 解决方案

    之前发布了 <.Net Core DevOps -免费用Azure四步实现自动化发布(CI/CD)>之后,有很多朋友私信我说如何替换 appsettings 里面的 ConnectionS ...

  10. Java 读取properties 配置文件的几种方式

    基于ClassLoder读取配置文件 Properties properties = new Properties(); // 使用ClassLoader加载properties配置文件生成对应的输入 ...