2013-01-14 54 views
3

我試圖在我的應用程序中關閉一些測試孔,發現JaCoCo sonar插件在我的枚舉中給我一個較小的覆蓋範圍,因爲它認爲我應該測試軟件包名稱。爲什麼聲納(JaCoCo)要求我測試我的軟件包?

這是爲什麼?

它向我展示了其中一個枚舉的97%的覆蓋率,並在這樣的包聲明的頂部顯示了一條紅線,告訴我要測試它......它在所有枚舉和枚舉中都是如此。

Sonar screenshot

+0

您可以爲其中一個枚舉添加coverage選項卡的屏幕截圖嗎? –

+0

@ Fabrice-SonarTeam當然......那就是! –

+0

好的,這看起來很奇怪......你使用的是哪個版本的Sonar?使用哪個構建工具?我建議你使用內置的JaCoCo覆蓋工具,而不需要更多的配置。 –

回答

2

我來到這裏尋找這個問題的答案,並經過一些挖我發現,這是由於可在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繼承的新枚舉創建一個新的測試類) ,但我沒有很多枚舉,所以我還沒有感受到任何壓力。

+0

努力+1 ...謝謝!你應該把這個推給JaCoCo的人,這樣他們就可以開始工作了。 –

相關問題