如何在 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()
,但如前所述:这是您的最后选择,而不是您的首选。
我需要能够根据某些条件调用间谍对象的真实方法。 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()
,但如前所述:这是您的最后选择,而不是您的首选。