PowerMock常用测试场景

PowerMock是一个单元测试模拟框架,他的出现是为了解决EasyMock、JMock、Mockito根本没有办法完成的工作,比如Mock一个static方法等等,更多的将PowerMock 理解为对现有Mock 框架的扩展和进一步封装是比较贴切的,PowerMock 现在目前提供了两套UT(Unit Test)框架的封装,请看下图。
这里写图片描述

maven工程PowerMock的获取需要在pom中添加相应的jar包。

<properties>
    <powermock.version>1.6.5</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-mockito</artifactId>
        <version>${powermock.version}</version>
        <scope>test</scope>
    </dependency>
</dependencies>

PowerMock常用的测试场景(参考PowerMock实战手册)

(1)mock一个局部变量

    EmployeeDao employeeDao = PowerMockito.mock(EmployeeDao.class);
    //当方法体内部有new时使用when new
    PowerMockito.whenNew(EmployeeDao.class).withAnyArguments().thenReturn(employeeDao);

(2)mock一个公有方法

    PowerMockito.when(employeeDao.getTotal()).thenReturn(10);

(3)mock一个静态方法

    @PrepareForTest({EmployeeUtils.class})
    PowerMockito.mockStatic(EmployeeUtils.class);
    PowerMockito.when(EmployeeUtils.getEmployeeCount()).thenReturn(10);

(4)mock一个私有方法

    PowerMockito.doNothing().when(employeeService, "checkExist", Mockito.anyString());   // Mock私有方法

(5)mock一个私有静态方法

    PowerMockito.spy(EmployeeService.class);
    PowerMockito.doNothing().when(EmployeeService.class, "checkExist", Mockito.anyString());  // Mock静态私有方法

(6)mock一个Final类
如果NewEmployeeDao是一个final类,同样可以通过如下方法mock其中的一个方法

  NewEmployeeDao employeeDao = PowerMockito.mock(NewEmployeeDao.class);
    PowerMockito.when(employeeDao.insertEmployee(new Employee())).thenReturn(true);

(7)Mock方法的任意输入
可以用PowerMockito.any(输入参数类名.class)的方式mock任意输入参数

    PowerMockito.when(newEmployeeDao.getTotal(PowerMockito.any(String.class))).thenReturn(10);

(8)Mock方法多次调用返回不同值
下面语句表示在第一次调用getTotal的时候返回10,第二次调用的时候返回9:

    PowerMockito.when(newEmployeeDao.getTotal(PowerMockito.any(String.class))).thenReturn(10).thenReturn(9); 

猜你喜欢

转载自blog.csdn.net/rockywallet/article/details/81386650