PowerMock

  • PowerMock简介
    • 一、PowerMock?
    • 二、Mock底层原理
      • 1.Mockito
      • 2.PowerMock原理
    • 三、应用场景
      • 1.依赖问题,“打桩”
      • 2.工程质量
  • PowerMock使用步骤
    • 一、添加依赖
    • 二、注解
    • 三、PowerMock复杂用例

PowerMock简介

一、PowerMock?

PowerMock是一个Java单元测试模拟框架,用于解决测试问题。

举个例子,你在使用Junit进行单元测试时,并不想让测试数据进入数据库,怎么办?

这个时候就可以使用PowerMock,不进行真正的数据库操作(或接口调用,dubbo调用,http请求等),并模拟返回参数。mock对象就是在调试期间用来作为真实对象的替代品。

PowerMock支持JUnit和TestNG,扩展了EasyMock和Mockito框架,语法规则与Mockito一致,主要区别在于使用方面。
PowerMock实现了对静态方法,构造方法、私有方法以及final方法的模拟支持。(也支持mock的对象是在方法内部new出来的),总体来说更加强大。

二、Mock底层原理

1.Mockito

底层使用了动态代理,用到了CGLIB。因此需要被mock的对象,Mockito都会生成一个子类继承该类,代理的对象会代替真实的对象进行执行。子类会覆盖父类。而static 修饰的方法不能被覆盖(也就是不能被重写)。这也就是为什么final修饰的类,private 方法。static 方法不可以被Mock的原因

2.PowerMock原理

javassist是一个修改java字节码的工具包,objenesis是一个绕过构造方法来实例化一个对象的工具包。由此看来,PowerMock的本质是通过修改字节码来实现对静态和final等方法的mock的。

当某个测试方法被注解@PrepareForTest标注以后,在运行测试用例时,会创建一个新的org.powermock.core.classloader.MockClassLoader实例,然后加载该测试用例使用到的类(系统类除外)。

PowerMock会根据你的mock要求,去修改写在注解@PrepareForTest里的class文件(当前测试类会自动加入注解中),以满足特殊的mock需求。例如:去除final方法的final标识,在静态方法的最前面加入自己的虚拟实现等。

如果需要mock的是系统类的final方法和静态方法,PowerMock不会直接修改系统类的class文件,而是修改调用系统类的class文件,以满足mock需求。

三、应用场景

1.依赖问题,“打桩”

在现实的软件开发中,我们经常需要协同其他的同事一起来完成某个模块的动能开发,当我们需要测试的模块依赖于其他模块无法进行单元测试的时候,此时该模块的质量风险就有两个,第一是你所负责的代码,第二是你所依赖的代码。当你没有办法在很快的时间协调到资源,那么你负责的代码不具备单元测试环境没有办法进行测试,可能存在很大的风险,这个时候如何测试你的代码,就需要用到mock。

2.工程质量

可以很好支持单元测试,可以查看代码的覆盖率,来作为代码质量指标。
部分大公司会参照覆盖指标来确认质量,80%覆盖率的工程上线。

PowerMock使用步骤

一、添加依赖

<!-- PowerMock JUnit 4.4+ Module -->
<dependency><groupId>org.powermock</groupId><artifactId>powermock-module-junit4</artifactId><version>2.0.0</version><scope>test</scope>
</dependency>
<!-- PowerMock Mockito2 API -->
<dependency><groupId>org.powermock</groupId><artifactId>powermock-api-mockito2</artifactId><version>2.0.0</version><scope>test</scope>
</dependency>
<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope>
</dependency>

二、注解

PowerMock有两个重要的注解:

@RunWith(PowerMockRunner.class)
@PrepareForTest({XxxUtil.class})
@PowerMockIgnore("javax.management.*")

@RunWith(PowerMockRunner.class)
告诉JUnit使用PowerMockRunner进行测试
@PrepareForTest( { YourClassWithEgStaticMethod.class })
当你需要使用PowerMock强大功能(Mock静态、final、私有方法等)的时候,就需要加注解PrepareForTest。
@PowerMockIgnore(“javax.management.*”)
为了解决使用powermock后,提示classloader错误

三、PowerMock复杂用例

待更新…

PowerMock介绍和用法相关推荐

  1. Java 动态代理介绍及用法

    Java 动态代理介绍及用法 一,静态代理模式的特点 在之前的文章中 java代理模式 已经介绍里java里的(静态)代理模式 下面是上文静态代理类的例子: public class ProxyBea ...

  2. Java中BigDecimal类介绍及用法

    Java中BigDecimal类介绍及用法 Java中提供了大数字(超过16位有效位)的操作类,即 java.math.BinInteger 类和 java.math.BigDecimal 类,用于高 ...

  3. chrome介绍与用法

    chrome介绍与用法 chrome介绍与用法 1. 认识devTools Elements 面板 console控制面板 Sources 资源面板 chrome介绍与用法 1. 认识devTools ...

  4. at指令 meid_AT指令介绍及用法,AT 指令集合

    AT指令介绍及用法,AT 指令集合 AT指令在当代手机通讯中起着重要的作用,能够通过AT指令控制手机的许多行为,包括拨叫号码.按键控制.传真.GPRS等.西门子M55手机为我提供了很多的AT指令,网络 ...

  5. C#中File和FileStream的简单介绍和用法

    前言 在近期的工作过程中发现自己的基础比较薄弱,所以最近在恶补基础知识.下面就对我所学习的File类和FileStream进行简单的总结. 1.首先先介绍File类和FileStream文件流 1.1 ...

  6. c语言isnumber函数用法,科技教程:ISNUMBER函数介绍及用法

    如今越来越多的小伙伴对于ISNUMBER函数介绍及用法这方面的问题开始感兴趣,看似平静的每一天,在每个人身上都在发生着各种各样的故事,因为大家现在都是想要了解到此类的信息,那么既然现在大家都想要知道I ...

  7. TS简单介绍以及用法

    TS简单介绍以及用法 一.什么是TS TS是TypeScript的缩写,是JavaScript的超集 (JS有的TS都有),也可以说TS是 type + js,加了一个类型.比如:JS:let a = ...

  8. C语言rand和srand函数的简单介绍和用法

    目录 介绍: 用法: 介绍: 在c语言中,我们想要在一个范围内随机生成一个数字,我们就需要用到rand函数,生成大小为0到32767的整数,但仅靠rand生成的数是伪随机的数,如下: 第一次运行n次: ...

  9. HTML中的link的简单介绍和用法

    <!DOCTYPE html> <html> <head>     <meta charset="utf-8">     <l ...

最新文章

  1. 什么是DCI? 它有什么用?
  2. 潘建伟团队首次实现18个光量子比特纠缠,刷新世界记录
  3. AngularJS 学习笔记 - $http.post 跟后台交互
  4. php 返回map,PHP Ds\Map get()用法及代码示例
  5. 区分柱状图(条形图)和直方图
  6. 基于快速GeoHash,如何实现海量商品与商圈的高效匹配?
  7. c语言双引号和单引号的区别_Python中的单引号和双引号有什么区别?
  8. 小程序页面跳转的几个方法和区别
  9. 关于c语言的英文论文,C语言论文外文翻译.doc
  10. 机器学习的挑战:黑盒模型正面临这3个问题
  11. 102.如何减轻缓存失效时上游服务的压力
  12. 转:MSSQL SERVER行转列 列转行
  13. 用计算机模拟高空救援的过程是人工智能在,本科-人工智能复习题
  14. dynamix判定_Dynamix
  15. java转码工具应用程序_java转码工具native2ascii.exe的使用方法
  16. Android 11.0 蓝牙去掉传输文件的功能
  17. 关于证明PAC可学习
  18. Clipper库 | 类型和填充规则
  19. (心得三)java俄罗斯方块小游戏编写心得
  20. Android一键加QQ群

热门文章

  1. 数据解析15个新一线城市2020年GDP情况,“最牛”地级市是哪里?
  2. 学计算机用x260可以吗,联想X260电脑健盘使用方法
  3. Android 悬浮窗适配问题
  4. 专访重庆光博士才俊明
  5. c语言string函数详解
  6. 回归问题中的MAE,MSE,MAPE与R方
  7. 号码归属地查询---------------
  8. 除了拳打脚踢 还有哪些家庭暴力?
  9. Themeleaf 循环遍历list
  10. [Unity3D·CSV篇]01.CSV新手级读取