我为我的项目编写了多个 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/