內STS

2013-07-15 29 views
8

剔除艾瑪合成類時試圖運行覆蓋範圍或使用艾瑪運行一個Maven構建:艾瑪我得到如下:內STS

java.lang.IllegalStateException:無法訪問方法:不能設置。 靜態最後的[Z場packageName.ClassName $ jacocoData到[Z

所以我周圍中搜索網上,我發現EclEmma網站上的以下內容:

我的代碼使用反射。爲什麼當我用JaCoCo執行它時會失敗?

要收集的執行數據JaCo​​Co文書被測 其將兩個成員的類的類:專用靜態字段 $ jacocoData和私人靜態方法$ jacocoInit()。兩個成員 都被標記爲合成。

請更改代碼忽略合成成員。無論如何,這是一個很好的練習 ,因爲Java編譯器在某些情況下創建合成成員 。

但我在網上找不到關於如何實際忽略Emma合成成員的任何文檔。

在STS我期待在首選項/的Java /代碼覆蓋和我看到的不包括盒子來裝排除(我知道我也可以把我的POM排除)。

我只是想知道什麼需要去那裏排除所有的合成類。

謝謝

+0

的「哈克」的方式忽略了'$ jacocoData'是知道一個事實,即它是在集體成員列表的末尾總是添加。儘管如此,我們非常想知道如何排除Java/Scala類的任何合成成員。 –

+0

運氣好嗎?我遇到過同樣的問題,現在我正在尋找如何更改代碼以忽略合成成員_。 – topr

回答

9

我最近遇到了這個問題,我使用了一個通用的CSV導出助手。您看到的例外是Jacoco/Emma無法設置它用於跟蹤代碼覆蓋率的綜合字段。您需要允許Emma訪問該合成字段。

如果您已經停止艾瑪訪問合成領域,因爲添加合成領域是造成你的反射,如問題。您使用反射來遍歷Field對象的集合,只要做到以下幾點:

Field[] fields = fooObject.getClass().getDeclaredFields(); 
Field[] nonSyntheticFields = new Field[fields.length]; 

for(int i = 0; i < fields.length; i++){   
    if(!fields[i].isSynthetic()){ 
     nonSyntheticFields[i] = fields[i]; 
     //Or whatever processing you are doing here with your fields. 
    } 
} 

以上,您可以分離出合成領域,您的應用程序應該不是真的一無所知,從字段你已經在你的課堂上宣佈了。我知道這看起來有點冒失,但這是我能想出的最優雅的解決方案。 Emma需要這個領域能夠測試你的代碼,你所能做的最好的事情就是確保你的代碼不會混淆這個綜合變量。