请注意,始终建议使用Mockito.when(Object)进行存根,因为它是参数类型安全的,并且更具可读性(尤其是在存根连续调用时)。
以下是doReturn()派上用场的罕见情况:
1.监视真实对象并在监视上调用真实方法会带来副作用
List list = new LinkedList(); List spy = spy(list);
//不可能:调用了真正的方法,因此spy.get(0)抛出IndexOutOfBoundsException(列表尚未为空)
when(spy.get(0)).thenReturn("foo");
//您必须使用doReturn()进行存根:
doReturn("foo").when(spy).get(0);
2.覆盖以前的异常处理:
when(mock.foo()).thenThrow(new RuntimeException());
//不可能:调用带有异常标记的foo()方法,从而引发RuntimeException。 when(mock.foo()).thenReturn("bar");
//您必须使用doReturn()进行存根:
doReturn("bar").when(mock).foo();
以上方案显示了Mockito优雅语法的折衷方案。请注意,这种情况非常罕见。间谍活动应该是零星的,并且很少使用异常处理。更不用说总的来说,过度存根是一种潜在的代码气味,它指出了太多的存根。
doReturn()
很有用。