mockito - Cobertura 显示正确的覆盖范围,但在 Sonar 中许多文件显示 0% 覆盖范围

标签 mockito sonarqube powermock easymock

enter image description here我为我的项目编写了多个 JUnit 测试类。当我使用 cobertura 插件在 Eclipse 中看到代码覆盖率时,代码覆盖率是 80%。但是当我尝试在 Sonar 中查看代码覆盖率时,它只显示 35%。这背后的原因是多个类的覆盖率为 0%,有些类显示覆盖率。我不知道主要原因是什么。是 Sonar 问题还是我的代码存在问题,因为我在 EasyMock 和 Mockito 的某个地方使用 PowerMockito。

我附上了 cobertura 显示的覆盖范围快照和 Sonar 显示的覆盖范围快照。 请帮助我。

谢谢

最佳答案

PowerMockito 和代码覆盖率计算存在一个已知问题。无论如何,PowerMockito 应该很少使用。 Mockito 不提供 PowerMockito 提供的功能的原因主要是 Mockito 试图让您专注于良好的、可测试的代码(静态和最终代码不是)。 在我使用 PowerMockito 并且代码覆盖率计算不正确的几个地方,我编写了一个小 Reflection Util 类,它允许我从属性中删除 static 和 final 。完成此操作后,我可以像常规实例属性一样模拟属性,并且可以正确计算代码覆盖率。我对静态最终 Logger 日志属性执行此操作,例如,如下所示:

[...] @ mock 私有(private)记录器 logMock; [...] @之前 公共(public)无效 initMocks() 抛出异常 { MockitoAnnotations.initMocks(this); [...] ReflectionUtils.setFinalStatic(MyClass.class.getDeclaredField("LOG"), logMock);

ReflectionUtils 类的代码我无法在这里发布,但可以在网上轻松找到示例。

P.s.顺便说一句,如果你有 80% 到 35% 的差距,这意味着你有 45% 的代码是静态的和/或最终的,在我个人看来,你的代码有一个很大的设计缺陷,你应该在之前修复它在 Sonar 中调整代码覆盖率测量...

关于mockito - Cobertura 显示正确的覆盖范围,但在 Sonar 中许多文件显示 0% 覆盖范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28087791/

相关文章:

maven - SonarQube - 无法加载组件类

java - 无法在 Sonar 中解析 'Untrusted XML should be parsed with a local, static DTD'

java - Powermock : Mocked method still called

java - 升级到 2.7 ClassNotFoundException : org. mockito.exceptions.Reporter 后运行测试

unit-testing - 单元测试(模拟)数据库,如何使用模拟验证数据库方法?

java - 使用参数映射模拟 jdbctemplate

java - Mockito doReturn().when() 调用原始方法

unit-testing - 未注入(inject)模拟对象

java - Sonar 配置

java - 通过 Maven 的 PowerMockRunner 使用 Mockito 运行 Junit & PowerMock