如何在 Mockito 中的间谍对象条件下调用真实方法?

How to call real method on condition of spied object in Mockito?

我需要能够根据某些条件调用间谍对象的真实方法。 IE。如果条件为真,则调用真实方法,否则执行其他操作。

为了清楚起见,我需要在第一次调用时抛出异常,并在第二次调用时调用真正的方法。是否可以使用Mockito实现?

Object object = Mockito.spy(new Object());

// On the first call I need to throw an exception like this
Mockito.doThrow(RuntimeException.class).when(object).toString();

// On the second call I need to call a real method
Mockito.doCallRealMethod().when(object).toString();

简单,使用 when(...).then(...),因为它允许 "fluent chaining" 的模拟规格:

Object object = Mockito.spy(new Object());
Mockito.when(object.toString()).thenThrow(new RuntimeException()).thenReturn("yeha");

try {
  System.out.println(object.toString());
  fail();
} catch(RuntimeException r) {
  System.out.println(object.toString());
}

打印:

yeha

耶哈!

说真的:无论如何你应该更喜欢 when(mock.foo()).then...(请参阅 here 以了解原因列表)。在某些情况下需要使用 doReturn().when(),但如前所述:这是您的最后选择,而不是您的首选。