簡體   English   中英

為什么EclEmma沒有使用@RunWith(PowerMockRunner.class)進行測試的覆蓋代碼

[英]Why EclEmma doesn't coverage code with tests with @RunWith(PowerMockRunner.class)

我正在使用EclEmma和Eclipse來幫助我知道我的項目中缺少代碼測試的地方,但所有使用@RunWith(PowerMockRunner.class)測試都沒有被調用,因此沒有經過測試。

我正在使用JUnit 4.8.1和Mockito。

會是什么呢?

它為雙方報告了一個已知錯誤:

http://code.google.com/p/powermock/issues/detail?id=402 https://github.com/jacoco/eclemma/issues/15#issuecomment-9565210

然而, eCoberture似乎提供了正確的報道。 唯一的問題,它似乎不再被維護,你無法刪除Eclipse Juno的亮點。

在這里你可以找到有效的例子,可以幫助你解決這個問題https://github.com/Godin/jacoco-experiments

使用mvn clean package來查看jacoco報告

我們有一個靜態類來模擬。 使用模擬靜態類,eclEmma代碼覆蓋插件在Eclipse中不起作用。 所以我們所做的是,在課堂上放置@RunWith(JUnit4.class)(而不是@RunWith(PowerMockRunner.class))並在課堂內放置以下行

static {
PowerMockAgent.initializeIfNeeded();
}

@Rule
public PowerMockRule rule = new PowerMockRule();

編譯了類並運行了測試類。 代碼覆蓋率適用於課堂。 此更改僅用於在Eclipse IDE中運行eclEmma插件,沒有任何問題。

編寫測試用例后,我們將代碼恢復正常。 放置@RunWith(PowerMockRunner.class)而不是@RunWith(JUnit4.class)並在上面注釋靜態代碼和powermockrule行。

AFAIK eclEmma以及許多其他覆蓋系統會修改.class文件以添加覆蓋指令。 大多數這些工具在“編譯時”執行此操作,而不是在運行時執行。

相反,PowerMock以及AspectJ LTW和許多其他系統在“運行時”操作相同的字節碼:

PowerMock是一個框架,可以擴展其他模擬庫,例如EasyMock,具有更強大的功能。 PowerMock使用自定義類加載器和字節碼操作來實現靜態方法,構造函數,最終類和方法的模擬,私有方法,靜態初始化程序的刪除等。

我對eclEmma(各種版本)和Cobertura與AspectJ LTW結合都有類似的問題,因為當.class文件的運行時修改發生時,它會以某種方式破壞覆蓋工具之前完成的修改。

我還沒有找到解決方案,但至少找到了症狀。

正確的解決方案是調試PowerMock儀器並找出它在何處以及如何打破覆蓋工具。 對於測試工具來說,打破覆蓋工具是一個很大的問題,因為兩者經常在一起使用:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM