注意:我理解在间谍中我们可以区分这两者。 我在互联网上走了一段路,但我仍然对Doreturn /何时以及何时返回Mockito感到怀疑.Below是我的疑问,
1)doreturn / when和when / thenreturn对模拟对象的作用相同吗? 也就是说,无论你是否为doreturn / when或when / thenreturn调用一个模拟对象,它都不会调用真正的方法,而是调用存根调用。 我的理解是对的吗?
2)doreturn / when和when / thenreturn仅对Mockito中的间谍对象产生影响。 即doreturn / when - 不会调用真正的方法,而且/ thenreturn会调用真正的方法。我的理解是正确的吗?
如果我对上述2点的理解是正确的,那么我们应该总是使用doreturn / when,这样我们就不需要学习2种语法,对吗?
答案 0 :(得分:3)
doReturn()
州的Mockito documentation:
对于任何方法,您可以使用doThrow(),doAnswer(),doNothing(),doReturn()和doCallRealMethod()来代替使用when()的相应调用。
时有必要
- stub void methods
- 间谍对象的存根方法(见下文)
- 多次使用相同的方法,在测试过程中更改模拟的行为。
还有...
在无法使用when(Object)的情况下使用doReturn()。
给出一个例子......
when(mock.foo())。thenThrow(new RuntimeException());
//不可能:调用异常存根的foo()方法,因此抛出RuntimeException。 当(mock.foo())thenReturn( “条”);
//你必须使用doReturn()进行存根:
doReturn( “条”)时(模拟)包含.foo();
通常,您应该使用when(...).thenReturn(...)
语法,并且doReturn(...).when(...)
语法有用的情况很少见。但是,重要的是要注意模拟void方法需要when(...)
模式,这种模式并不罕见。这只是doReturn(...)
语法,不太常用。
专门回答您的问题:
不,这两种语法的工作方式略有不同 - 'doReturn(...)'能够设置模拟对象,以便在调用模拟方法之前记录行为,而'when(...)'语法通过做一些幕后的jiggery-pokery来设置一个'thenReturn(...)'方法可以处理的存根处理程序。他们通常具有相同的效果,但实际差异在上面的角落情况中变得明显。
对于模拟,when(...)
调用模拟对象上的存根方法。这就是为什么围绕重新定义存根行为的重要案例很重要。
答案 1 :(得分:2)
经过我自己的行动,我开始知道:
希望它有所帮助!