AspectJ 与 Jacoco 在报告生成过程中导致“随机失败”

问题描述 投票:0回答:1
  • Windows 11 专业版(24H2)
  • Java 21(21.0.2 2024-01-16 LTS)
  • jacoco-maven-插件 0.8.12
  • AspectJ 1.9.22.1
  • Spring Boot 3.3.4
  • J单元5

我有一个 Spring Boot 服务,我使用 Jacoco maven 插件来生成测试覆盖率报告。我还使用 AspectJ(Aspectjrt 和 Aspectjweaver)对 Hibernate Validator 中的某些行为进行运行时编织(基本上在一些地方将

HashSet<?>
替换为
LinkedHashSet<?>
以保留顺序)。

  • 在 Postman 中发送请求时,生产中一切正常。 AspectJ 编织所有工作均按预期进行。
  • 我还编写了单元测试来验证运行时编织行为。当我在 IntelliJ 中运行测试(单个或多个)时,它们都通过了。
  • 当我使用
    mvnw test
    通过命令行运行所有单元测试时,所有测试也都通过了。

现在讨论这个问题:)。当我使用

mvnw -B package -Pcoverage
运行 Jacoco 报告时,我在不相关的单元测试中得到“随机”、看似不相关的错误。

这些错误显示为(我在不相关的单元测试中得到了其中 4 个):

 ┬╗ BootstrapMethod bootstrap method initialization exception

在调用堆栈中,我看到:

Caused by: java.lang.ClassCastException: class java.lang.Class cannot be cast to class java.lang.invoke.MethodType (java.lang.Class and java.lang.invoke.MethodType are in module java.base of loader 'bootstrap')
        ... 14 more

正如我所提到的,这些测试都可以在 IntelliJ 中或通过

mvnw test
完美运行,只是在我运行 Jacoco 报告时则不然。

我使用 Surefire 插件并将其设置如下:

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <configuration>
      <argLine>
        @{argLine}
        -javaagent:"${settings.localRepository}/org/aspectj/aspectjweaver/${aspectj.version}/aspectjweaver-${aspectj.version}.jar"
        -XX:+EnableDynamicAgentLoading
      </argLine>
    </configuration>
  </plugin>

现在,在上面,我首先有 Jacoco 代理,然后是 AspectJ。 Jacoco 的人就是这么说的。我还发现了来自 AspectJ 人员的 Github 问题,他说 AspectJ 应该放在第一位。

当我首先拥有 Jacoco 时,我遇到了上面提到的问题。如果我将 Jacoco 移至第二位置,则单元测试 100% 通过,但 Jacoco 不会报告我的方面代码的覆盖率。如果我首先有 Jacoco(并注释掉失败的测试),那么它实际上会报告我的方面代码的覆盖率。

此外,我有一个 Github 操作,可以运行 Jacoco 报告(在 Linux 映像上)来创建覆盖徽章,如果我先有 Jacoco,则一切都会通过并且覆盖范围按预期工作。

总而言之,我似乎只在 Windows 11 机器上本地生成 Jacoco 报告时遇到问题。它不可能是我的单元测试或方面代码,因为它们都以我提到的 4 种方式中的 3 种通过。然后我还注意到,如果我注释掉一个单元测试,所有这些不相关的错误都会消失。

有什么想法吗?

编辑:

Google 群组帖子中提到 Jacoco 首先: https://groups.google.com/g/jacoco/c/HSiLWA3uT6g

@kriegaex 提到首先要使用 AspectJ 的 github 问题: https://github.com/jacoco/jacoco/issues/909

java spring-boot aspectj jacoco jacoco-maven-plugin
1个回答
0
投票

我偶然发现了 @kriegaex 的另一个 github 问题,它引导我找到了解决方案 (https://github.com/eclipse-aspectj/aspectj/issues/170)。

在代理订单中将 JaCoCo 放在第一位是各个方面的代码覆盖率所必需的。但是,该顺序可能会导致“随机”代码损坏,如 github 问题和各种其他 github 问题中所示。 添加

-XnoInline

AspectJ 选项可以修复此问题。

我的万无一失的配置现在看起来像这样:

<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <argLine> @{argLine} -javaagent:"${settings.localRepository}/org/aspectj/aspectjweaver/${aspectj.version}/aspectjweaver-${aspectj.version}.jar" -XX:+EnableDynamicAgentLoading </argLine> </configuration> </plugin>

并且(因为这是一个 Spring Boot 项目),我的 aop.xml 如下所示:

其中

-XnoInline

添加到编织器选项中。不再有“随机”代码损坏!

    

© www.soinside.com 2019 - 2024. All rights reserved.