我試圖在我的應用程序中關閉一些測試孔,發現JaCoCo sonar插件在我的枚舉中給我一個較小的覆蓋範圍,因爲它認爲我應該測試軟件包名稱。爲什麼聲納(JaCoCo)要求我測試我的軟件包?
這是爲什麼?
它向我展示了其中一個枚舉的97%的覆蓋率,並在這樣的包聲明的頂部顯示了一條紅線,告訴我要測試它......它在所有枚舉和枚舉中都是如此。
我試圖在我的應用程序中關閉一些測試孔,發現JaCoCo sonar插件在我的枚舉中給我一個較小的覆蓋範圍,因爲它認爲我應該測試軟件包名稱。爲什麼聲納(JaCoCo)要求我測試我的軟件包?
這是爲什麼?
它向我展示了其中一個枚舉的97%的覆蓋率,並在這樣的包聲明的頂部顯示了一條紅線,告訴我要測試它......它在所有枚舉和枚舉中都是如此。
我來到這裏尋找這個問題的答案,並經過一些挖我發現,這是由於可在Jacoco期待已編譯的枚舉類的字節碼可以找到一些靜態方法被覆蓋。經過一番實驗後,我想出了以下超類用於使用JUnit 4進行枚舉的單元測試。這解決了使用枚舉的覆蓋問題。
import org.junit.Test;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import static org.junit.Assert.assertEquals;
public abstract class EnumTest {
@Test
public void verifyEnumStatics() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
Class e = getEnumUnderTest();
Method valuesMethod = e.getMethod("values");
Object[] values = (Object[]) valuesMethod.invoke(null);
Method valueOfMethod = e.getMethod("valueOf", String.class);
assertEquals(values[0], valueOfMethod.invoke(null, ((Enum)values[0]).name()));
}
protected abstract Class getEnumUnderTest();
}
,然後用它是這樣的:
public class TravelTypeTest extends EnumTest {
@Override
protected Class getEnumUnderTest() {
return TravelType.class;
}
// other test methods if needed
}
這是一個粗略的第一次嘗試 - 它不枚舉的工作,不管出於什麼原因沒有任何條目,無疑有更好的方法來獲得相同的效果,但這將通過確保您可以檢索枚舉的值來執行生成的靜態方法,並且如果您將第一個枚舉條目的名稱傳遞給valueOf()方法,您將獲得首先枚舉返回。
理想情況下,我們會編寫一個測試,用於搜索待測試包中的所有枚舉,並以相同方式自動執行它們(並避免必須記住爲每個從EnumTest繼承的新枚舉創建一個新的測試類) ,但我沒有很多枚舉,所以我還沒有感受到任何壓力。
努力+1 ...謝謝!你應該把這個推給JaCoCo的人,這樣他們就可以開始工作了。 –
您可以爲其中一個枚舉添加coverage選項卡的屏幕截圖嗎? –
@ Fabrice-SonarTeam當然......那就是! –
好的,這看起來很奇怪......你使用的是哪個版本的Sonar?使用哪個構建工具?我建議你使用內置的JaCoCo覆蓋工具,而不需要更多的配置。 –