1. PowerMock介绍(本章属于普及知识,熟悉这直接跳过)
软件设计开发过程中,通常采用分模块、并行开发的模式。在开发周期中,当前模块所依赖的其他模块只有接口,没有具体实现。为了实现对当前模块的单元测试,需要通过mock手段来mock未实现的其他接口。另外,模块还有依赖其他第三方库的情况,而在运行单元测试的过程中,很多第三方lib要么因为缺少条件或资源无法加载,要么直接调用非常消耗运行资源。既然单元测试的重点是当前模块的逻辑,所以可以使用mock手段代替对第三方库的直接调用。
在java程序的单元测试中常用的mock工具有Mockito和EasyMock。但是这两种mock工具都无法实现对静态、final、私有方法或类的mock。因此有了功能强大的PowerMock工具。PowerMock并不是一个独立、全新的工具而是在Mockito和EasyMock的基础上进行的扩展,它分别有针对Mockito级EasyMock的扩展实现。本文重点介绍PowerMockito。
PowerMock是通过直接修改class文件字节码的方式实现对特定对象的mock。事实上是直接改变了mock对象的实现逻辑。在使用PowerMock的情况下,如Jacoco等的测试覆盖率工具是无发正确统计出单元测试覆盖率的。
2. 基本应用
待测试方法:
public String methodToTest() {
return classToMock.methodToMock();
}
测试case:
@RunWith(PowerMockRunner. class)
public class PowerMocTestCase {
@Test
public void normalTest(){
ClassToMockclassToMock = PowerMockito.mock(ClassToMock.class);
PowerMockito. when(classToMock.methodToMock()).thenReturn( "mockObject");
ClassToTestclassToTest = new ClassToTest(classToMock);
Assert. assertEquals("mockObject",classToTest.methodToTest());
}
}
其中@RunWith注解用于指定PowerMockRunner作为Junit的runner。
classToMock为生成的mock对象。
PowerMockito.when().thenReturn()...用于为mock对象的方法指定返回值。如果没用显示的指定方法行为,mock对象的方法调用就会根据powermock的具体配置执行默认行为,而不会调用真实方法。
3. Mock Static
待测试方法:
public String methodToTest() {
return ClassToMock.methodToMock();
}
测试case:
@RunWith(PowerMockRunner. class)
@PrepareForTest({ClassToMock.class })
public class PowerMocTestCase {
@Test
public void mockStaticTest(){
PowerMockito. moc