2012-10-31 64 views
11

我正在测试一个void方法,它碰巧在一个类中调用其他几个void方法(所有这些方法都在同一个类中)。该方法是沿着这些线路的东西...如何忽略Mockito中void方法内的几个void方法调用

public void methodToTest() { 
    methodA(); 
    methodB(); 
} 

void methodA() { 
    methodA1(); 
    methodA2(); 
    methodA3(); 
} 

我想要做的是使上述methodA()什么也不做。也就是说,我想methodA()基本上是这样的:

void methodA() { } 

我在methodA()尝试都doThrow()doAnswer()无济于事。就好像这些都被完全忽略了一样。

什么,我已经试过一个例子...

doThrow(new RuntimeException()).when(mockedClass).methodA(); 

有没有办法做到这一点只用的Mockito?我无权改变正在修改的课程。

+1

这应该工作,你确定'methodA'不是'最终'? – Brice

+0

'methodA'不是'final' –

+1

回头看看你的代码片段看起来像你想要做一个部分模拟,也许只有执行'methodB'时,你正在执行'methodA'。你当然使用'mock(YourObject.class)',那么当然一个mock什么都不做,当然也不会执行真正的代码。你可以实现你想要的'spy(YourObject.class)'它默认会执行真正的代码。然而,部分模拟被认为是测试气味,如果不是设计气味,您应该寻找机会将'methodA'的行为作为一个依赖项,例如,您可以在API中将其暴露为'AStrategy'。 – Brice

回答

18

如果您正在寻找methodB仍然执行,而methodA什么都不做。这将做到这一点:

TestClass spy = spy(new TestClass()); 
doNothing().when(spy).methodA(); 
spy.methodToTest(); 
+0

我没有提到它,但我实际上是在使用你的例子中列出的间谍。我尝试了这个在我的类中的确切代码,并且methodA()的内部仍然在执行,这正是我试图避免的... –

+1

你是否使用了'doNothing()的倒数表示法。when()'像上面那样,或者你使用'when()。thenReturn()'表示法?当调用'when'行代码时(即,当部分模拟的替代行为正在被改变时),后一种形式实际上调用间谍上的真实方法,并且这可能导致问题。因此,需要使用以前的'没有'记号间谍,以避免这个问题 –

+0

@KevinWelker - 我使用'doNothing()。when()' –