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

Java 使用Jacoco对使用Powermock编写的测试类进行单元测试覆盖率,java,maven,junit,powermock,jacoco,Java,Maven,Junit,Powermock,Jacoco,我正试图在詹金斯的sonarqube仪表板上获取代码覆盖率报告。代码覆盖率报告即将发布,但仅显示4.6%的覆盖率。在调查中,我发现使用PowerMock编写的测试类被跳过了 在进一步的调查中,我发现“JaCoCo不能很好地处理动态修改/创建的类(这就是powermock的工作方式)。这是一个已知的限制,我们目前对此无能为力” 有没有什么解决办法,这样我也可以为使用PowerMock编写的测试类获得适当的代码覆盖率。简单回答:没有 答案很长-归结为以下几个选项: 让PowerMock团队研究一下

我正试图在詹金斯的sonarqube仪表板上获取代码覆盖率报告。代码覆盖率报告即将发布,但仅显示4.6%的覆盖率。在调查中,我发现使用PowerMock编写的测试类被跳过了

在进一步的调查中,我发现“JaCoCo不能很好地处理动态修改/创建的类(这就是powermock的工作方式)。这是一个已知的限制,我们目前对此无能为力”


有没有什么解决办法,这样我也可以为使用PowerMock编写的测试类获得适当的代码覆盖率。

简单回答:没有

答案很长-归结为以下几个选项:

  • 让PowerMock团队研究一下这个Wiki——也许“离线检测”对你来说是可行的
  • 希望相应的问题在某个时候得到解决(我不会为此屏住呼吸)
  • 通过重构和改进生产代码,摆脱对PowerMock(ito)的依赖
  • [我想我很久以前就评估过各种覆盖工具;有一种商业工具声称可以与PowerMock一起使用。但我不记得任何细节。所以我基本上是说:另一种专有覆盖工具与PowerMock一起使用的可能性很小]

我使用
PowerMock模块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>
...

在这里,您可以看到sonar考虑了PowerMock模拟的静态方法和
new
语句:

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


看看

对我有效的方法是删除此

@RunWith(PowerMockRunner.class)
并将其添加到类中

@Rule
public PowerMockRule rule = new PowerMockRule();
还需要添加powermockito junit4规则的依赖项

<dependency>
  <groupId>org.powermock</groupId>
  <artifactId>powermock-module-junit4-rule</artifactId>
  <version>2.0.2</version>
  <scope>test</scope>
</dependency>

org.powermock

将有助于更多地理解它

在JaCoCo的情况下,可以选择使用脱机检测-请参阅,但是您是对的,即使EclEmma基于JaCoCo,到今天为止,在EclEmma中也无法使用脱机检测;谢谢你的意见!离线插装也可以用于获得jenkins上jacoco的代码覆盖率吗?@Manas你不应该期望我们提供完整的、完全准备好“消化”的解决方案。回答这个问题可能仅仅包括花一些时间去找出答案。当然,如果有人能给出一个明确的“不,它不会起作用”,那可能会为你节省一些时间。但最后:这是你的项目,所以你应该看看这个建议能让你走多远。我只是按照这个例子,相应地更新了我的pom。它仍然显示了4.6%的代码覆盖率,所以它对我不起作用,所以我问了这个问题。嗨,欢迎来到StackOverflow。您发布的问题不属于此处讨论的问题范围。请参阅,了解您可以在此处提出哪些问题。您好。看来您不必使用JaCoCo的离线检测来实现这一点……是真的吗?你还在用JaCoCo的在线仪器吗?是的,这是真的。使用我在示例项目中为您提供的配置,所有的覆盖率都是使用Jacoco和PowerMock代理来衡量的。我对这项工作的可能性感到非常兴奋。但是,我使用了您的示例项目中的pom作为示例,还没有取得任何成功。基本上,我的所有单元测试现在都失败了,出现了各种错误,其中许多错误以如下形式出现:
java.lang.VerifyError:在分支目标49处需要stackmap框架异常详细信息:com/fasterxml/jackson/databind/ObjectMapper{此处更多}原因:在该位置需要stackmap框架。字节码:0x0000000:8a2a bb00 8c59 1040{更多信息}
我已经包括了PM Runner和代理fwiw。我错了!我无法让Eclipse覆盖率配置正常工作(目前还不能),但这很简单。当我实际运行
mvn clean install
时,它工作得非常好。这是巨大的事实-我觉得你应该张贴在Github PowerMock页面上,如果你还没有!有趣。你能分享你的代码让我看看吗?您正在使用JUnit5吗?我在使用JUnit5时遇到了一些问题,但在使用JUnit4进行更改后,一切都正常了。