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);