2009-05-25 76 views
3

我想用EMMA來測量一些使用JMockit的JUnit測試的覆蓋率。但是,當我嘗試EMMA插裝,關於測試的四分之一後運行JMockit測試失敗,出現以下錯誤:使用JMockit和EMMA的ClassFormatError

com.logstorage.engine.sensor.SensorManagerTest.setUpBeforeClass(SensorManagerTest.java:98) 
    java.lang.ClassFormatError 
    at sun.instrument.InstrumentationImpl.redefineClasses0(Native Method) 
    at sun.instrument.InstrumentationImpl.redefineClasses(InstrumentationImpl.java:150) 
    at mockit.internal.RedefinitionEngine.redefineMethods(RedefinitionEngine.java:152) 
    at mockit.internal.RedefinitionEngine.redefineMethods(RedefinitionEngine.java:139) 
    at mockit.internal.RedefinitionEngine.redefineMethods(RedefinitionEngine.java:73) 
    at mockit.Mockit.setUpMock(Mockit.java:235) 
    at com.myapp.MyTest.setUpBeforeClass(MyTest.java:98) 

我看不到任何模式爲哪些測試失敗,哪些沒有。我想這只是JMockit中的一個錯誤,但有沒有人知道解決方法?

我發現了一個非常類似的問題,名爲「與EMMA獲取ClassFormatError?」但解決方案不適合我(我沒有使用任何reentrant = true模擬方法)。任何其他想法?

在此先感謝。

+0

它必須是月球的排列。沒有任何變化,兩天前我沒有收到這個錯誤! – 2009-05-28 21:15:34

回答

2

我一直在遇到同樣的問題 - 這似乎已經解決了我的問題,並希望能夠幫助其他任何人。

如果通過ant運行此,請確保你沒有varsjavac目標的debuglevel說法。以下目標將導致錯誤。

<javac srcdir="${src}" destdir="${bin}" debug="on" debuglevel="lines,source,vars" nowarn="true" /> 

將其更改爲:

<javac srcdir="${src}" destdir="${bin}" debug="on" debuglevel="lines,source" nowarn="true"> 

這可能是一個JMockit錯誤 - 非常微妙的,annyoing找出來。

+0

它工作!你是一個拯救生命的人!這是我放棄了「不可修復」的東西:) – 2009-06-01 01:55:12

0

我今天只看到了這個問題,但是如果可以的話,給我發一些測試,在使用EMMA運行時拋出ClassFormatError,我會嘗試在JMockit中找到這個錯誤。

順便說一下,您是否嘗試過使用JMockit Coverage?只需將jmockit-coverage.jar添加到類路徑中,並查看獲得的內容即可。通常,這將在工作目錄下的「覆蓋報告」目錄中生成(沒有任何額外配置)良好的HTML覆蓋報告。它不會比這更容易!

+0

感謝您的提議,但這個問題是在工作中的項目,我不認爲我的公司會很高興我發送給你一些源代碼。如果我設法做一個展示問題的示例測試,我會告訴你。 我還沒有試過JMockit覆蓋。我會檢查出來的!我使用EMMA的主要原因是Eclipse和Hudson都有很好的插件。 – 2009-07-01 02:34:55

0

我的團隊遇到同樣的問題。具體的例子是:使用jMockit在TeamCity下運行的單元測試套件中的一個類中使用EMMA作爲覆蓋工具來模擬靜態方法。該解決方案是以下幾點:

添加拆除方法,其嘲笑靜態方法每個測試:從1.5

@After 
public void tearDown() throws Exception { 
    Mockit.tearDownMocks(ClassWithStaticMethods.class); 
} 
0

更新jmockit任何最新版本。