2013-09-27 24 views
9

我想使用PowerMock和Mockito來模擬一些靜態方法調用。我儘可能地遵循了SO以及PowerMock Getting StartedMockStatic頁面的說明和示例,但我還沒有完成mockStatic()調用。設置Powemockito進行靜態模擬

當我從我的測試類調用mockStatic(讓Foo.class),我給出的excception:

java.lang.NoClassDefFoundError: org/Mockito/mock/MockName 
at org.powermock.api.mockito.PowerMockito.mockStatic(PowerMockito.java:70) 
at ...my test class method call... 

我敢肯定,這是一個設置問題,因爲我一直在尋找中使用的術語爲了設置這是相當混亂。我確實從PowerMock downloads抓取了Mockito Zip。在Eclipse(3.5.2)中,我打開了項目屬性並添加了所有的Jars到構建路徑。我也嘗試將整個解壓縮的powermockito文件夾添加到我的環境變量類路徑中,然後只是powermockito jar,特別是當這種情況沒有奏效時。

我有這些annotationsat我的測試類的類級別爲好,每powermock說明:

@RunWith(PowerMockRunner.class) 
@PrepareForTest(ApplicationContextLoader.class) 

而且這些特定powermock-進口:

import org.powermock.api.mockito.PowerMockito; 
import org.powermock.core.classloader.annotations.PrepareForTest; 
import org.powermock.modules.junit4.PowerMockRunner; 

對於那些你們誰之前使用過PowerMockito,即使只是一個指向正確方向的指針,或者要檢查的東西也會非常有幫助。我很努力地看到我的設置與我所看到的帖子的不同之處 - 從我能說的 - 相同的語法。

+0

你有沒有找到一個解決辦法? – Dave

+0

不是我記得,雖然已經有幾年了。我從@Walls得到了答案,所以這一定是最有幫助的,缺乏解決方案。 – Ubunfu

回答

3

如果您使用的是靜態模擬對象,請在您的PrepareForTest批註中添加除靜態類本身之外還使用靜態對象的類。如果您正在測試的類需要使用此靜態,請將當前類添加到註釋中。你實際上並沒有模擬這個類,但是它需要在靜態的註解中進行。這聽起來很奇怪,但它起作用。

在註釋中添加多個類時,可以在{}之間包含它們,並用逗號分隔。例如,如果您的靜態類是StaticA.class和使用靜態類是CallerOfStatic.class你可以使用:

@RunWith(PowerMockRunner.class) 
@PrepareForTest({StaticA.class, CallerOfStatic.class}) 
+0

謝謝,我只是試了一下,使我的註釋看起來像這樣:@RunWith(PowerMockRunner.class)@PrepareForTest({ApplicationContextLoader.class, \t \t TestClass.class}) public class TestClass {..test class code ...}' – Ubunfu

+0

@Ubunfu做到了這一點:) – Walls

+0

哈哈,顯然我太忙了,試圖讓那個可讀性說那個部分。但是,不,它似乎沒有任何區別。 – Ubunfu

24

也許,Powermock和中的Mockito的版本不兼容。解決這個問題,它不再是一個問題了。

Mockito      PowerMock 
1.10.8+      1.6.2+ 
1.9.5-rc1 - 1.9.5   1.5.0 - 1.5.6 
1.9.0-rc1 & 1.9.0   1.4.10 - 1.4.12 
1.8.5      1.3.9 to 1.4.9 
1.8.4      1.3.7 & 1.3.8 
1.8.3      1.3.6 
1.8.1 & 1.8.2    1.3.5 
1.8       1.3 
1.7       1.2.5 

參見:https://github.com/jayway/powermock/wiki/MockitoUsage

0

使對齊,在這張圖表中肯定powermockito和的Mockito版本 - https://github.com/jayway/powermock/wiki/MockitoUsage#supported-versions

找到簡單的方法是,

mvn dependency:tree | grep mockito 
[INFO] | \- org.mockito:mockito-core:jar:1.8.5:compile 
[INFO] +- org.mockito:mockito-all:jar:1.9.5:compile 
[INFO] +- org.powermock:powermock-api-mockito:jar:1.5.6:compile 

在我的情況,powermock 1.5.6和mockito 1.9.5已對齊,但不得不更改爲使用mockito 1.8.5,因爲someo在依賴關係中的其他人已經在使用mockito 1.8.5。

以下組合完美的作品對我來說,

mvn dependency:tree | grep mockito 
[INFO] | \- org.mockito:mockito-core:jar:1.8.5:compile 
[INFO] +- org.mockito:mockito-all:jar:1.8.5:compile 
[INFO] +- org.powermock:powermock-api-mockito:jar:1.4.9:compile