我继续使用以下代码在我的UT上获取WanterButNotInvoked异常:

@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已执行,但是当我尝试验证它时,它说与该模拟没有任何交互。谢谢!

最佳答案

这里的问题是您创建了一个CounterHandler的新实例,它是单例实例的间谍。但是,您没有做任何事情用此间谍将CounterHandler类替换为单例实例帮助。因此,当您的类调用getInstance时,它将获取实际实例,而不是间谍。

您需要做的是模拟构造函数调用,以使单例实例成为模拟对象。阅读本文,其中显示了如何执行此操作,并讨论了使用Singleton的替代方法。

Mocking a singleton with EasyMock and PowerMock

10-08 04:07