用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

相关文章
相关标签/搜索