注意:我知道在间谍方面我们可以区分这两者。
我遍历了互联网,但仍然对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(...)
在模拟对象上调用存根方法。这就是为什么重新定义存根行为很重要的原因。