用PowerMock mock 臨時變量

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

相關文章
相關標籤/搜索