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/

相关文章:

java - Spring在测试中不调用@Bean方法

java - 将此 lambda 替换为方法引用

Sonarqube 支持 ‘.Net Core’(扩展名为 .xproj)项目

java - PowerMock 抛出 NoSuchMethodError (setMockName)

static - 如何使用 PowerMock 模拟返回 void 的静态方法?

尝试模拟时出现 java.lang.ExceptionInInitializerError

java - 如何模拟junit覆盖率的异常?

android - MVP kotlin 中的 Mockito 测试 - 但是,与此模拟异常恰好有 1 次交互

git - SonarQube 无法从 Jenkins 项目获取 git Blame 信息

java - 如何模拟 Final 类并进行代码覆盖