2014-10-09 35 views
3

我不斷獲取WanterButNotInvoked例外,在我的UT與下面的代碼:模擬單類無效的方法使用PowerMockito

@RunWith(PowerMockRunner.class) 
@PrepareForTest({ CounterHandler.class, 
TrHandlerProtocolsCounterHandler.class, IProtocolCounterHandler.class }) 

@Test 
public void testInitialize() 
{ 
    IProtocolCounterHandler counter = new TrHandlerProtocolsCounterHandler(); 
    CounterHandler mockCounter = PowerMockito.spy(CounterHandler.getInstance()); 
    PowerMockito.doNothing().when(mockCounter).initialize(); 

    counter.initialize(); 
    Mockito.verify(mockCounter).initialize(); 

} ================ ======
CounterHandler類

public void initialize() { 
    //do something 
} 

======================
TrHandlerProtocolsCounterHandler類

@Override 
public void initialize() { 
    CounterHandler.getInstance().initialize(); 
} 


我已經調試這Counterhandler.getInstance.initialize被執行了,但是當我嘗試驗證它,它說,有與模擬沒有互動。謝謝!

回答

5

這裏的問題是,你已經創建了一個CounterHandler的新實例,它是單例實例的間諜。然而,你沒有做任何事情來替代這個間諜的CounterHandler類的單例實例幫助。因此,當你的班級呼叫getInstance時,它會得到實際的實例,而不是間諜。

你需要做的是模擬構造函數調用,使單例實例是一個模擬。閱讀這篇文章,其中展示瞭如何做到這一點,並提供了有關使用Singleton的替代方法的討論。

Mocking a singleton with EasyMock and PowerMock

+0

+1最好把文章的內容放在這裏,很容易引用。因爲鏈接可能會在某段時間後中斷。 – 2017-10-03 09:22:31

相關問題