使用Powermock实现单元测试,提高单元测试覆盖率

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
  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值