我已经为我的项目编写了多个JUnit测试类。当我在Eclipse中使用cobertura插件看到代码时,代码覆盖率为80%。但是当我试图在Sonar中看到我的代码覆盖率时它仅显示35这背后的原因是多个类的覆盖率为0%,有些类显示覆盖率。我不知道的主要原因是什么。是声纳的问题还是有一些问题我的代码因为某处我使用的是PowerMockito在某个地方EasyMock和某个Mockito。
我附上了cobertura展示的覆盖范围和Sonar显示的覆盖范围的快照。 请帮助我。
谢谢
答案 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中的代码覆盖率测量...