PowerMock原理及样例代码
一、PowerMock简介
PowerMock 也是一个单元测试模拟框架,它是在其它单元测试模拟框架的基础上做出的扩展。通过提供定制的类加载器以及一些字节码篡改技巧的应用,PowerMock 现了对静态方法、构造方法、私有方法以及 Final 方法的模拟支持,对静态初始化过程的移除等强大的功能。因为 PowerMock 在扩展功能时完全采用和被扩展的框架相同的 API, 熟悉 PowerMock 所支持的模拟框架的开发者会发现 PowerMock 非常容易上手。PowerMock 的目的就是在当前已经被大家所熟悉的接口上通过添加极少的方法和注释来实现额外的功能,目前,PowerMock 仅支持 EasyMock 和 Mockito。
(一)Mockito和EasyMock可模拟以下场景:
- 模拟对象
- 模拟方法调用的返回值
- 模拟方法调用抛出异常
- 模拟调用方法时的参数匹配
- 模拟方法调用次数
- 校验行为
- 模拟方法调用
- 参数匹配
- 校验方法调用次数
- 模拟无返回方法抛出异常
- 校验方法调用顺序
- 校验方法是否从未调用
- 快速创建Mock对象
- 自定义返回不同结果
- 对返回结果进行拦截
(二)PowerMock
1.PowerMock支持EasyMock和Mockito。
2.PowerMock支持JUnit和TestNG。
3.PowerMock能够完美的弥补Mockito的不足,能mock静态、final、私有方法等
二、PowerMock的原理
(一)mock对象的普通的public方法
1、Mockito的基本原理就是使用方法拦截器,判断每次方法调用的状态来对方法进行相应的操作
(二)mock静态、final、私有方法
1.当某个测试方法被注解@PrepareForTest标注以后,在运行测试用例时,会创建一个新的org.powermock.core.classloader.MockClassLoader实例,然后加载该测试用例使用到的类(系统类除外)。
2.PowerMock会根据你的mock要求,去修改写在注解@PrepareForTest里的class文件(当前测试类会自动加入注解中),以满足特殊的mock需求。例如:去除final方法的final标识,在静态方法的最前面加入自己的虚拟实现等。
3.如果需要mock的是系统类的final方法和静态方法,PowerMock不会直接修改系统类的class文件,而是修改调用系统类的class文件,以满足mock需求。
2、maven依赖:
<properties>
<powermock.version>2.0.9</powermock.version>
</properties>
<dependencies>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>${powermock.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito2</artifactId>
<version>${powermock.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
<!-- 需要单独引入mockito-core,否则无法mock static方法 -->
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>2.28.2</version>
<scope>test</scope>
</dependency>
三、PowerMock的使用方式以及代码示例
地址:LTL/HelloPowerMock (gitee.com)
1、Mock局部变量
2、Mock静态方法
3、Mock final修饰的方法
4、Mock 私有方法
5、Mock不同的构造函数
6、Verify的使用
7、Argument Matcher接口的使用
8、Answer接口的使用
9、Spy的使用
10、整合springboot
11、mockmvc