使用Jacoco为使用Powermock编写的测试类进行单元测试覆盖

时间:2017-05-09 11:40:24

标签: java maven junit powermock jacoco

我想在jenkins上的sonarqube仪表板上获取代码覆盖率报告。代码覆盖率报告即将出炉,但仅覆盖率为4.6%。在调查时我发现使用PowerMocks编写的测试类被忽略了。

在进一步调查中,我发现“JaCoCo与动态修改/创建的类不兼容(这是powermock的工作方式)。这是一个已知的限制,我们目前无法做任何关于”。

是否有任何解决方法可以为使用PowerMocks编写的测试类获得正确的代码覆盖率。

3 个答案:

答案 0 :(得分:1)

简单回答:不,没有。

答案很长 - 归结为这些选项:

  • 由PowerMock团队研究这个Wiki page - 也许“离线仪器”可能适合你。
  • 希望相应的bug在某个时刻得到修复(我不会屏住呼吸)
  • 摆脱对PowerMock(ito)的依赖 - 通过重构和改进您的生产代码
  • [我认为我很久以前就评估了各种报道工具;并且有一个商业版声称甚至可以使用PowerMock。但我不记得任何具体细节。所以我基本上说:可能是另一个专有覆盖工具与PowerMock配合使用的极小机会]

答案 1 :(得分:1)

我已经成功使用powermock-module-javaagent通过Jacoco生成了PowerMock报道。

只需确保将Powermock代理放在 jacoco代理之后:

<artifactId>maven-surefire-plugin</artifactId>
            <configuration>
                <useSystemClassLoader>true</useSystemClassLoader>
                <argLine>${jacocoArgLine} -javaagent:${settings.localRepository}/org/powermock/powermock-module-javaagent/${powermock.version}/powermock-module-javaagent-${powermock.version}.jar -noverify</argLine>
...

如果要查看示例,请查看以下项目:https://github.com/jfcorugedo/sonar-scanner

在这里您可以看到声纳将静态方法和PowerMock模拟的new语句考虑在内:

enter image description here

如果要模拟new语句,请确保使用PowerMockRule而不是PowerMockRunner

看看this test

答案 2 :(得分:0)

对我有用的是删除它

purrr::map2(list_1[common_names],  list_2[common_names], `+`)

并将其添加到类中

@RunWith(PowerMockRunner.class)

还需要为powermockito junit4规则添加依赖。

@Rule
public PowerMockRule rule = new PowerMockRule();

这个 official page 将有助于更多人理解它。 PowerMock