在開發時,常常遇到這種狀況,被測試方法所調用的類不是經過構造注入的,而是經過臨時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