2014-10-09 63 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

相关问题