在开发时,常常遇到这种状况,被测试方法所调用的类不是经过构造注入的,而是经过临时new出来的,以下面待测方法:测试
public class EmployeeService { private EmployeeDao employeeDao; public int getTotalEmployeeWithTempVariable() { EmployeeDao employeeDao = new EmployeeDao(); return employeeDao.getTotal(); } }
employeeDao是临时new出来的,而mockito和easyMock通常是经过代理来实现mock,这时就没法mock此类方法了。spa
而PowerMock经过直接修改class,使这类方法可测,代理
@PrepareForTest(EmployeeService.class) public class EmployeeServiceTest extends PowerMockTestCase { EmployeeService employeeService; @ObjectFactory public ITestObjectFactory getObjectFactory() { return new PowerMockObjectFactory(); } @BeforeMethod public void init(){ employeeService = new EmployeeService(employeeDao); } @Test public void testGetTotalEmployeeWithTempVariable() { try { PowerMockito.whenNew(EmployeeDao.class).withNoArguments() .thenReturn(employeeDao); PowerMockito.when(employeeDao.getTotal()).thenReturn(10); int total = employeeService.getTotalEmployeeWithTempVariable(); assertEquals(10, total); } catch (Exception e) { e.printStackTrace(); } } }
这里有三个很重要的地方:code
@PrepareForTest(EmployeeService.class):告诉PowerMock,须要修改EmployeeService的class文件对象
@ObjectFactory:告诉testNG以对象工厂的形式建立测试实例blog
extends PowerMockTestCase :继承此接口继承
此外须要接口
PowerMockito.whenNew(EmployeeDao.class).withNoArguments()
.thenReturn(employeeDao);开发
录制EmployeeDao的构造行为并返回实例get