注意:我知道在间谍方面我们可以区分这两者。
我遍历了互联网,但仍然对Mockito中的doreturn /何时,何时/ thenturn感到怀疑。以下是我的疑问:

1)模拟对象的返回/何时,何时/然后返回是否相同?
即:对于模拟对象调用doreturn / when或何时/ thenturn并不重要,它不会调用real方法,而是调用存根调用。
我的理解是正确的吗?

2)doreturn /何时,何时/ thenturn仅对Mockito中的间谍对象有所不同。
即doreturn / when-不会调用真正的方法,何时/ thenreturn将调用真正的方法。对此我的理解正确吗?

如果我对以上两点的理解是正确的,那么我们应该始终使用doreturn / when,这样我们就不需要学习2种语法,对吗?

最佳答案

doReturn()Mockito documentation状态:


对于任何方法,都可以使用when()代替doThrow(),doAnswer(),doNothing(),doReturn()和doCallRealMethod()。当你有必要


存根无效方法
间谍对象的存根方法(请参见下文)
多次对同一方法进行存根测试,以在测试过程中更改模拟的行为。



并且...


在无法使用when(Object)的极少数情况下,请使用doReturn()。


以...为例


when(mock.foo())。thenThrow(new RuntimeException());

//不可能:调用带有异常标记的foo()方法,从而引发RuntimeException。
when(mock.foo())。thenReturn(“ bar”);

//您必须使用doReturn()进行存根:
doReturn(“ bar”)。when(mock).foo();


通常,应该使用when(...).thenReturn(...)语法,并且doReturn(...).when(...)语法有用的情况很少。但是,需要注意的是,模拟void方法需要when(...)模式,这种情况并不罕见。只是doReturn(...)语法不常用。

具体回答您的问题:


不,两种语法的工作方式略有不同-'doReturn(...)'能够设置模拟对象以在调用模拟方法之前记录行为,而'when(...)'语法通过进行一些幕后花招,以设置可以使用'thenReturn(...)'方法的存根处理程序。它们通常会具有相同的效果,但是在上面的特殊情况下,实现上的差异会很明显。
对于模拟,when(...)在模拟对象上调用存根方法。这就是为什么重新定义存根行为很重要的原因。

10-06 07:17