java – 使用PowerMockito的void方法模拟单例类

我继续使用以下代码获取我的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已经执行但是当我试图验证它时,它说没有与mock的交互.谢谢!

解决方法:

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

你需要做的是模拟构造函数调用,以便单例实例是一个模拟.阅读本文,其中介绍了如何执行此操作,并讨论了使用Singleton的替代方法.

Mocking a singleton with EasyMock and PowerMock

上一篇:java – Mockito – Mock相同类型的通用对象


下一篇:java – Mockito没有正确地将列表作为参数的存根方法