2012-03-15 127 views
11

我在Eclipse中使用EclEmma來幫助我知道我的項目中缺少代碼測試的位置,但是所有與@RunWith(PowerMockRunner.class)的測試都未被調用,因此未經測試。爲什麼EclEmma沒有使用@RunWith(PowerMockRunner.class)測試覆蓋代碼

我正在使用JUnit 4.8.1和Mockito。

它可能是什麼?

+1

你能否提供像Mockito,PowerMock和EclEmma這樣的更多細節? – Brice 2012-03-16 00:12:45

+0

嘿,我在eclEmma 1.5.x中使用eclEmma的版本2.1.0,它是該版本中的一個bug,它顯示的測試覆蓋率很高。 – LottaLava 2012-03-19 19:35:42

+0

好的,從版本2.x開始,似乎_EclEmma_不再使用_Emma_。他們正在使用自己的被稱爲JaCoCo的覆蓋工具。由於我不知道您使用的PowerMock版本,您應該嘗試PowerMock 1.4.11,其中包含一些與JaCoCo相關的修復:http://powermock.googlecode.com/svn/trunk/changelog.txt – Brice 2012-03-20 09:50:21

回答

0

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

PowerMock代替,還有的AspectJ LTW和許多其他系統,操作同樣的字節碼,但在「運行時間」:

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

我有兩個eclEmma(各種版本)和的Cobertura類似的問題在使用AspectJ LTW,導致組合時的.class文件在運行時修改發生,它在某種程度上破壞由覆蓋工具以前做的修改。

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

正確的解決方案是調試PowerMock工具並找出它在哪裏以及如何打破覆蓋工具。這是一個相當的問題,對於一個測試工具,打破覆蓋工具,因爲兩者經常一起使用:)

0

我們有一個靜態類嘲笑。通過模仿靜態類,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行進行評論。

相關問題