注意:我知道在间谍中,我们可以在这两者之间有所不同。我在互联网上都去了,但我仍然对doreturn/何时何时/何时/何时在Mockito中进行疑问。
1)doreturn/shile/sher/thenreturn对模拟对象的作用相同吗?即:无论您是调用doreturn/何时或何时/何时/何时/theTreturn以获取模拟对象,都不会调用真实方法,而是一个固执的调用,这并不重要。我的理解是正确的吗?
2)doreturn/何时和何时/何时/theTreturn仅对Mockito中的间谍对象有所作为。即doreturn/何时 - 不会称呼真实的methos,/theTreturn何时称为真实方法。我的理解正确吗?
如果我对上述2分的理解是正确的,那么我们应该始终使用doreturn/n时,以便我们不需要学习2个语法,对吗?
doReturn()
状态的嘲讽文档:
您可以使用dothrow(),doanswer(),donothing(),doreturn()和docallrealmethod()代替对相应的呼叫wher时()(),用于任何方法。当您
时,有必要
- 存根空白方法
- 间谍对象上的存根方法(见下文)
- 存根不止一次,以改变测试中间模拟的行为。
以及...
在您无法使用时(object)。
时,使用doreturn()。
给出了...
的示例何时(mock.foo())。thenthrow(new RuntimeException());
//不可能:被称为foo()方法的异常,因此抛出了RunTimeException。 当(mock.foo())。
//您必须使用doreturn()进行固执:
doreturn(" bar")。当(模拟).foo();
通常,您应该使用when(...).thenReturn(...)
语法,并且doReturn(...).when(...)
语法很有用的场合很少见。但是,重要的是要注意,嘲笑空隙方法需要when(...)
模式,这并不罕见。这只是doReturn(...)
语法,它不太常用。
专门回答您的问题:
no,两个语法的工作方式略有不同 - 'doreturn(...)'能够设置模拟对象以记录行为 调用模拟方法,而"何时(...)"语法可以通过进行一些幕后跳动 - 挑剔来建立一个存根处理程序,而" theTreturn(...)"方法可以使用该简短处理程序。他们通常会具有相同的效果,但是在上面的角案中,实施差异变得显而易见。
对于模拟,
when(...)
调用模拟对象上的固态方法。这就是为什么上面的角案围绕重新定义存根行为很重要。
在我自己做后,我知道:
- doreturn/何时和何时/何时/theTreturn对于模拟对象相同。他们都没有称为实际方法
- doreturn/何时和何时/何时/theTreturn对于间谍对象具有不同的行为。doreturn/何时 - 它不会在间谍对象上调用真实方法当/thanreturn时 - 它将调用间谍对象上的真实方法
希望它有帮助!