2014-06-24 115 views
0

我是mockito + powermock的新手。我試圖模擬一個擁有私有靜態內部類的類。我面臨ExceptionInInitializerError。有人可以幫助我正確地初始化課程。如何使用Powermock模擬私人靜態內部類

錯誤:

java.lang.ExceptionInInitializerError 
    at sun.reflect.GeneratedSerializationConstructorAccessor9.newInstance(Unknown Source) 
    at java.lang.reflect.Constructor.newInstance(Unknown Source) 
    .................... 
    .................... 
Caused by: java.lang.NullPointerException 
    at com.ibm.retail.xpd.pos.messaging.topics.TopicComponentHelper.<init>(TopicComponentHelper.java:10) 
    at com.ibm.retail.xpd.pos.messaging.topics.NodePath.<init>(NodePath.java:11) 
    at com.ibm.retail.xpd.pos.messaging.service.RetailPlatformService.<init>(RetailPlatformService.java:69) 
    at com.tgcs.scrt.gui.components.PageManager$PageControlService.<init>(PageManager.java:216) 
    at com.tgcs.scrt.gui.components.PageManager.<clinit>(PageManager.java:242) 
    ... 69 more 

類的樣子:

public class PageManager{ 
    ......... 
    ......... 
    private static class PageControlService extends PlateFormService{ 
    ......... 
    } 
} 

嘲諷類測試用例:

PowerMockito.mockStatic(PageManager.class); 

回答

3

看起來你錯過:

使用@RunWith(PowerMockRunner.class)a在測試用例的類級別上進行註釋。 在測試用例的類級別使用@PrepareForTest(ClassThatContainsStaticMethod.class)註釋。

來自:

https://github.com/jayway/powermock/wiki/MockStatic

@Marcin - 什麼可怕的,居高臨下答案。你經常需要模擬靜態類。例如,在basho的riak客戶端中,響應類是一個靜態的內部類(從他們的POV開始,它是有意義的 - 只有客戶端應該構造響應)。所以如果你想模擬客戶端返回的內容,你必須模擬一個靜態的內部類。

對於所有使用「不要模擬X」或者「你測試的代碼是錯誤的」單元測試問題的人來說,真的很累,只是因爲他們不知道答案。

+0

+1對'真的很累......'。我們大多數人都知道真正的公司如何處理單元測試,以及我們如何用無法重構的代碼創建單元測試,因此看到所有這些'這是一個可怕的想法','你沒有得到單元測試的本質'答案是完全可怕和無聊的。 –

+0

我完全不同意你。你可以將你的調用封裝在一個你控制的類中的模擬靜態方法,然後你可以嘲笑這個類。你不應該嘲笑你通常不擁有的類型。我正在刪除我的答案,因爲這實際上應該是一個評論。但我確實認爲有人試圖用錯誤的工具來解決錯誤的架構問題 –

相關問題