在使用Mockito和PowerMock写单测的时候发现,如果使用了PowerMock的@PrepareForTest注解,JaCoCo在统计代码覆盖率的时候就会忽略注解@PrepareForTest({})里面的类,导致覆盖率统计不准确

对于一些工具类,我们可以先使用@PrepareForTest完成单测的开发,再单独对工具类写单测就行了,只要@PrepareForTest里面的类不是自己的项目代码就可以了(比方说第三方jar包提供的), 但是在遇到系统类的时候就不行了。因为PowerMock 在mock系统类的返回结果时,就需要在@PrepareForTest{()}里写上调用系统类的Class,这样对应的业务类就无法被统计到

这是由于@PrepareForTest和java 覆盖率工具(Java Code Coverage – JaCoCo)冲突导致的

这是官方的解释:
Code coverage with JaCoCo

The simplest way to use JaCoCo it is — on-the-fly instrumentation with using JaCoCo Java Agent. In this case a class in modified when it is being loaded. You can just run you application with JaCoCo agent and a code coverage is calculated. This way is used by Eclemma and Intellij Idea. But there is a big issue. PowerMock instruments classes also. Javassist is used to modify classes. The main issue is that Javassist reads classes from disk and all JaCoCo changes are disappeared. As result zero code coverage for classes witch are loaded by PowerMock class loader.

JaCoCo和PowerMock都是通过在加载类的时候修改字节码文件来实现统计覆盖率和mock静态类的功能。JaCoCo在加载class的时候会把统计代码插入到class中,而PowerMock当使用了@PrepareForTest注解,在加载相关类的时候会从class文件重新读取字节码信息,导致JaCoCo的修改都没有了,所以就没办法统计到了

为了解决上述问题,Github上也给出了一个解决方案,那就是使用JaCoCo的offline模式

<!--- 定义 jacoco 版本 -->
<properties><jacoco.version>0.8.5</jacoco.version>
</properties>
<!--- 定义 jacoco 执行 offline 模式 goals -->
<build><plugins><!-- 注意不是在pluginManagement, pluginManagement中只是声明 --><plugin><groupId>org.jacoco</groupId><artifactId>jacoco-maven-plugin</artifactId><version>${jacoco.version}</version><executions><execution><id>default-instrument</id><goals><goal>instrument</goal></goals></execution><execution><id>default-restore-instrumented-classes</id><goals><goal>restore-instrumented-classes</goal></goals></execution></executions></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><!--离线模式必需指定, 否则到模块根目录而不是target目录了--><configuration><systemPropertyVariables><jacoco-agent.destfile>target/jacoco.exec</jacoco-agent.destfile></systemPropertyVariables></configuration></plugin></plugins>
</build>
<!--- 定义 jacoco 依赖  注意不是在dependencyManagement, dependencyManagement中只是声明-->
<dependencies><dependency><groupId>org.jacoco</groupId><artifactId>org.jacoco.agent</artifactId><version>${jacoco.version}</version><classifier>runtime</classifier></dependency>
</dependencies>

这样哪怕使用了@PrepareForTest注解,也不会影响到JaCoCo的代码覆盖率统计了,不过需要注意的是

Offline模式单元测试不能跨模块, 不能源码在A模块单测写在B模块

比方说:项目分成了四个模块,service,utils,dao,controller,你在写service单测的时候哪怕调用了utils的代码,但是在实际统计覆盖率的时候是没办法统计到的,需要单独针对每一个模块写单测

单元测试之关于JaCoCo和PowerMock冲突导致类覆盖率为0的问题相关推荐

  1. Java单元测试之模拟利器-使用PowerMock进行Mock测试

    首页 国产Linux Linux命令 openSUSE ArchLinux Slackware FreeBSD Ubuntu CentOS Fedora Debian PHP教程 在线教程 登录 注册 ...

  2. 单元测试之更强大的powermock

    前面一篇说到了Mockito的各种功能,可以帮助我们在编写测试用例的时候模拟对象的各种行为,但是Mockito对于一些场景还是无法满足,比方说静态方法,私有方法(不过一般正常的单元测试很少去mock私 ...

  3. java jacoco powerMock 单元测试覆盖率为0怎么解决

    我们项目中使用powerMock作为单元测试的mock工具,统计项目测试覆盖率使用jacoco编译的结果上传到sonar,但是jacoco 和 powerMock在运行时runtime加载代码的时候自 ...

  4. Java单元测试之JUnit4详解

    2019独角兽企业重金招聘Python工程师标准>>> Java单元测试之JUnit4详解 与JUnit3不同,JUnit4通过注解的方式来识别测试方法.目前支持的主要注解有: @B ...

  5. Java基础学习总结(24)——Java单元测试之JUnit4详解

    Java单元测试之JUnit4详解 与JUnit3不同,JUnit4通过注解的方式来识别测试方法.目前支持的主要注解有: @BeforeClass 全局只会执行一次,而且是第一个运行 @Before  ...

  6. Android 单元测试之Robolectric

    前言 在博客Android 单元测试之PowerMockito,主要介绍PowerMockito的使用和对Java测试用例的强大支持.但对于Android app开发来说,写起单元测试很痛苦:一方面单 ...

  7. php的old函数,laravel单元测试之phpUnit中old()函数报错解决

    php 的 laravel单元测试之phpUnit中old()函数报错解决 前言 最近在做laravel单元测试.遇到了一个问题: 当添加的view里面使用old()函数时就会报错,正常url访问没问 ...

  8. Android单元测试之Local unit tests(上)

    Android单元测试之Local unit tests(上) 简介 本地单元测试 JUnit 4 添加依赖 测试例子 结论 Mockito 添加依赖 测试例子-mock基本使用 测试例子-mock与 ...

  9. Android 单元测试之Mockito

    在博客Android 单元测试之JUnit4中,我们简单地介绍了:什么是单元测试,为什么要用单元测试,并展示了一个简单的单元测试例子.在文章中,我们只是展示了对有返回类型的目标public方法进行了单 ...

最新文章

  1. 函数-函数的基本组成
  2. ATL WTL 实现分析(五)
  3. iOS音频播放 (二):AudioSession 转
  4. PTA20、字典合并 (10 分)
  5. 软件开发:到底谁还在传言软件巨头濒临死亡?
  6. linux 路由跟踪命令_云计算网络知识学习-linux网络基础
  7. 8月23号,来上海整整一年
  8. 归纳推理测试没做完_无论顺还是剖,有几件事尽量在生娃当天做完,月子期间基本没负担...
  9. 【笔记】运筹(下)——Rita_Aloha
  10. Pcblayout——立创EDA
  11. 通过 PPT 快速给证件照换底色
  12. 中国姓氏人口排名及分布
  13. 恒生电子:控股股东恒生集团股权变更已完成工商变更登记手续
  14. c语言复杂万年历带农历,c语言实现农历万年历(48页)-原创力文档
  15. Ogre开发日记(一)
  16. AutoJs学习-读取手机短信
  17. 快速安装visual studio 2005 sp1补丁(转载)
  18. Java如何在main方法中实例化内部类对象
  19. 创作者身份认证申请规则及审核标准
  20. u盘无法格式化-免费u盘格式化恢复容量

热门文章

  1. python装饰器setter_第7.27节 Python案例详解: @property装饰器定义属性访问方法getter、setter、deleter...
  2. tomcat 环境配置
  3. Java 开源库精选(持续更新)
  4. web开发的跨域问题详解
  5. (PCB)进程控制块
  6. JavaScript: 对象
  7. 记一次重写easyui的datetimebox控件的小片段
  8. 基于SpringMVC、Maven以及Mybatis的环境搭建 【转】
  9. 查看xxx.a库架构的命令
  10. hdu 1568 Fibonacci 对数。。