关于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. 车载导航应用中基于Sketch UI主题定制方案的实现

    1.导读 关于应用的主题定制,相信大家或多或少都有接触,基本上,实现思路可以分为两类: 内置主题(应用内自定义style) 外部加载方式(资源apk形式.压缩资源.插件等) 其实,针对不同的主题定制实 ...

  2. Spring Boot Actuator 整合 Prometheus

    简介 Spring Boot 自带监控功能 Actuator,可以帮助实现对程序内部运行情况监控,比如监控状况.Bean加载情况.环境变量.日志信息.线程信息等.这一节结合 Prometheus .G ...

  3. Windows下计划任务的使用

    0x01 前言 在渗透测试中,尤其是域渗透,常常会用到Windows系统的计划任务,一是用于远程启动程序,二是用于程序的自启动 那么,计划任务具体有哪些使用技巧呢?是否对权限有要求?一定需要管理员权限 ...

  4. PHP 调试脚本

    如果想要通过php.exe直接运行和调试脚本,可以在PHPStorm配置如下: 1.PHP安装XDebug的扩展. 2.在PHPStorm中,配置XDebug: 1) 打开菜单 "文件&qu ...

  5. [Luogu2593] [ZJOI2006]超级麻将

    题目地址 :https://www.luogu.org/problemnew/show/P2593. 无脑DP(虽说是抄的额) #include <iostream> #include & ...

  6. Controller层的方法访问标志与Spring装配与AspectJ切面处理

    最近在做AspectJ实现的日志模块,在spring配置中加入了<aop:aspectj-autoproxy/>,之后发现,只要有用到自定义注解的类,某些方法经MVC请求时就报空指针错误. ...

  7. POJ 3080 Blue Jeans(串)

    题目网址:http://poj.org/problem?id=3080 思路: 以第一个DNA序列s为参考序列,开始做以下的操作. 1.将一个字母s[i]作为匹配串.(i为当前遍历到的下标) 2.遍历 ...

  8. 10.Nginx流行架构LNMP

    1.什么是LNMP架构 LNMP是指一组通常一起使用来运行动态网站或者服务器的自由软件名称首字母缩写.L指Linux,N指Nginx,M一般指MySQL,也可以指MariaDB,P一般指PHP,也可以 ...

  9. Airflow速用

    Airflow是Apache用python编写的,用到了 flask框架及相关插件,rabbitmq,celery等(windows不兼容):. 主要实现的功能 编写 定时任务,及任务间的编排: 提供 ...

  10. 为什么说HttpMessageConverter的顺序非常重要_SpringBoot

    问题描述 系统内配置了,ProtobufJsonFormatHttpMessageConverter和FastJsonHttpMessageConverter. Spring官方内置的默认Messag ...