【问题标题】:Cobertura Showing proper coverage but In sonar many files showing 0% coverageCobertura 显示适当的覆盖率,但在声纳中许多文件显示 0% 的覆盖率
【发布时间】:2015-03-21 04:29:02
【问题描述】:

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

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

谢谢

【问题讨论】:

  • 如果有人更早遇到这种问题,请帮忙
  • 谁能看一下这个问题
  • 如何导入代码覆盖率报告?你在 sonar.binaries 或 sonar.java.binaries 属性中提供什么?

标签: mockito sonarqube powermock easymock


【解决方案1】:

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

[...] @Mock private Logger logMock; [...] @Before public void initMocks() throws Exception { MockitoAnnotations.initMocks(this); [...] ReflectionUtils.setFinalStatic(MyClass.class.getDeclaredField("LOG"), logMock);

ReflectionUtils 类的代码我不能在这里发布,但是网上可以很容易地找到示例。

附:附带说明一下,如果您有 80% 到 35% 的差距,这意味着您有 45% 的代码是静态的或最终的,在我个人看来,您的代码存在很大的设计缺陷,您应该在此之前修复在 Sonar 中调整代码覆盖率测量...

【讨论】:

  • 如果您构建一个主要处理新 java.nio(文件)的服务。你不得不到处处理静态方法......
猜你喜欢
  • 2011-04-11
  • 2012-07-18
  • 1970-01-01
  • 2015-07-15
  • 2015-10-06
  • 2013-11-21
  • 2021-01-25
  • 2016-11-19
  • 2017-05-31
相关资源
最近更新 更多