2014-10-09 5 views
3

Я продолжаю получать WanterButNotInvoked исключение на моем UT на код ниже:Mock синглтон класс пустотой методом с использованием 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, являющийся шпионом экземпляра singleton. Тем не менее, вы ничего не сделали для замены справки экземпляра singleton классом CounterHandler с этим шпионом. Поэтому, когда ваш класс вызывает getInstance, он получает фактический экземпляр, а не шпион.

Что вам нужно сделать, это издеваться над вызовом конструктора, чтобы экземпляр singleton был макетом. Прочитайте эту статью, в которой показано, как это сделать, и обсуждается альтернатива использованию Singleton.

Mocking a singleton with EasyMock and PowerMock

+0

+1 Лучше поместить содержание статьи здесь, который легко ссылаться. Потому что связь может однажды сломаться. –

Смежные вопросы