前言
最近重新捡起了后台开发,正在为中型测试而发愁,那就抽空整理下PowerMock在我的项目中遇到的坑吧,因为这玩意也是挺坑的,我就不介绍PowerMock是啥了,自行用百度google一下吧。简单说Mock就是用来忽悠你的代码,让你的代码能脱离第三方模块(比如数据库操作)也能正常跑下去
用PowerMock前或者遇到问题时非常建议先看看官方文档:https://github.com/powermock/powermock/wiki
因为中文的很多博客写的挺乱挺老的,官方文档有比较好的案例代码,而且很官方,多好
简单整理下mock常见的几种情况:
- public 函数
- private/protected 函数
- static 函数
- final 函数
- 构造函数
不过我这里不准备一一讲解怎么去Mock,而是整理下我遇到的问题(** 任性 **),具体Mock方法可以参考官方文档,或者可以参考这篇博客:http://blog.csdn.net/jackiehff/article/details/14000779
我遇到的坑:
- Runner重叠冲突问题
重叠情况存在两种,但前提都是需要用到PowerMockRunner进行对static、final函数进行mock,因为这时要注明
@RunWith(PowerMockRunner.class)
;
第一种是:当你的测试类依赖其它Runner,如SpringRunner,需要注明@RunWith(SpringRunner.class)
,二者不可兼得啊;
第二种是:你有一个总的Runner,通过Suite去汇总所有的测试用例,一般用于输出测试报告,这是会发现注明了@RunWith(PowerMockRunner.class)
的类都不执行了,说得有点迷糊哈,可以参考这个案例:https://stackoverflow.com/questions/25500589/junit-method-level-category-does-not-work-with-powermockrunner
情况一有两种解决方法,第一种是通过PowerMockRunnerDelegate
解决,就是在SpringRunner上加一层壳,用法如下(参考官方文档:https://github.com/powermock/powermock/wiki/JUnit_Delegating_Runner):
第二种解决方案是通过
PowerMockRule
解决,这种方案同时可以解决情况二,所以比较推荐使用,一举两得,可参考官方文档:https://github.com/powermock/powermock/wiki/PowerMockRule
@PrepareForTest(X.class);
public class MyTest {
@Rule
PowerMockRule rule = new PowerMockRule();
// Tests goes here
...
}
直接简单粗暴,不用写@RunWith(PowerMockRunner.class)
了,PowerMock 1.4版本后用JUnit的Rule接口实现了PowerMock的初始化,不再需要RunWith了,要用PowerMockRule的话需要添加Maven:
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4-rule</artifactId>
<version>1.7.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-classloading-xstream</artifactId>
<version>1.7.0</version>
<scope>test</scope>
</dependency>
- 两种when()的使用方式
第一种,先发制人PowerMockito.doAnswer(answer).when(object).function();
:
例子如下:
第二种,后发制人PowerMockito.when(object.function()).thenAnswer(answer);
:
例子如下:
后语
整理的很任性,以后会慢慢加上一些内容