[英]How to ignore @SneakyThrows of Lombok in Jacoco code coverage?
你不能忽略某個代碼路徑,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.