Cobertura显示适当的覆盖范围,但在声纳中,许多文件显示0%的覆盖范围

时间:2015-01-22 11:34:38

标签: mockito sonarqube powermock easymock

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

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

谢谢

1 个答案:

答案 0 :(得分:2)

PowerMockito和代码覆盖率计算存在已知问题。无论如何,PowerMockito应该稀疏地使用。 Mockito没有提供PowerMockito提供的功能的原因,主要是Mockito试图让你专注于良好的,可测试的代码(静态和最终不是)。 在我使用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类的代码,但可以在网上轻松找到示例。

P.S。另外,如果你有80%到35%的差距,这意味着你有45%的代码是静态的或者是最终的,在我个人看来,你的代码存在很大的设计缺陷,你应该在之前解决调整Sonar中的代码覆盖率测量...