PowerMock使用问题小计(任性整理)

前言

最近重新捡起了后台开发,正在为中型测试而发愁,那就抽空整理下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):

PowerMock使用问题小计(任性整理)_第1张图片

第二种解决方案是通过 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:


  org.powermock
  powermock-module-junit4-rule
  1.7.0
  test


  org.powermock
  powermock-classloading-xstream
  1.7.0
  test


  • 两种when()的使用方式

第一种,先发制人PowerMockito.doAnswer(answer).when(object).function();
例子如下:

第二种,后发制人PowerMockito.when(object.function()).thenAnswer(answer);
例子如下:

后语

整理的很任性,以后会慢慢加上一些内容

你可能感兴趣的:(PowerMock使用问题小计(任性整理))