簡體   English   中英

如何在 Jacoco 代碼覆蓋率中忽略 Lombok 的@SneakyThrows?

[英]How to ignore @SneakyThrows of Lombok in Jacoco code coverage?

我使用 JaCOCO 查看代碼覆蓋率(並使用 Intellij 插件)。 我的代碼上有@SneakyThrows of lombok。 由於@SneakyThrows 只會將已檢查的異常轉換為未檢查的異常,因此我希望它不會影響代碼覆蓋率。

但是,它似乎降低了代碼覆蓋率:

我試圖將lombok.addLombokGeneratedAnnotation = true添加到我的lombok.config ,但沒有用。

感謝您的任何建議!

你不能忽略某個代碼路徑,jacoco 不支持它(它也不能忽略一個方法)。 由於缺乏更好的術語,它的度量單位是.class文件。 由於 jacoco 查看.class文件,該文件是在 lombok 處理器啟動生成的,因此您只需擁有未經測試的路徑。

簡而言之, jacoco看到您的文件就像它從未有過 lombok 注釋一樣。 所以你不能“排除”注釋。 我感受到了你的痛苦——我們有一些模塊,人們強制執行了非常多的覆蓋率,而這些 catch 塊幾乎一直都未經測試。

使用lombok.addLombokGeneratedAnnotation = true添加@Generated僅適用於生成整個方法的 Lombok 注釋。 但是, @SneakyThrows只會在帶注釋的方法內部的代碼周圍添加一個try-catch塊。

例如,如果您有以下方法並想從Thread::sleep偷偷拋出InterruptedException

package com.example;

import lombok.SneakyThrows;

public class Example {

  @SneakyThrows
  public void someMethod() {
    System.out.println("This method does a few things");
    System.out.println("Like counting to 10");
    for (int i = 0; i < 10; i++) {
      System.out.println(i);
    }
    System.out.println("And waiting a second");
    Thread.sleep(1000);
  }
}

生成的代碼如下所示:

package com.example;

public class Example {

  public void someMethod() {
    try {
      System.out.println("This method does a few things");
      System.out.println("Like counting to 10");

      for (int i = 0; i < 10; ++i) {
        System.out.println(i);
      }

      System.out.println("And waiting a second");
      Thread.sleep(1000L);
    } catch (Throwable e) {
      throw e;
    }
  }
}

您實際上只想在覆蓋檢查中忽略try-catch ,而不是整個方法,因此如果 Lombok 在整個方法中添加@Generated您將忽略比預期更多的覆蓋。

您可以做的是提取向新方法拋出檢查異常的代碼並添加@Generated@SneakyThrows

package com.example;

import lombok.Generated;
import lombok.SneakyThrows;

public class Example {

  public void someMethod() {
    System.out.println("This method does a few things");
    System.out.println("Like counting to 10");
    for (int i = 0; i < 10; i++) {
      System.out.println(i);
    }
    System.out.println("And waiting a second");
    waitOneSecond();
  }
  
  @Generated
  @SneakyThrows
  private void waitOneSecond() {
    Thread.sleep(1000);
  }
}

我對此的解決方案是嘗試模擬objectMapper以引發未經檢查的異常(例如:RuntimeException),然后代碼流將跳轉到內部以捕獲塊(由 Lombok 生成)並且將覆蓋 @SneakyThrows。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM