根据这篇文章,有两种方法可以模拟doSomeStuff()方法以返回1:
when(bloMock.doSomeStuff()).thenReturn(1);
和
doReturn(1).when(bloMock).doSomeStuff();
非常重要的区别在于,第一个选项实际上调用doSomeStuff()-方法,而第二个方法不会
所以,我的问题是,拥有第一个选项有什么意义,它实际上调用了实际的方法,但只返回1。在哪个用例中,我们可能想要这样的东西?
我挖掘了更多,关于为什么存在这两种语法的答案可以在旧的发行说明和参考邮件列表讨论中找到。
首先,doReturn()
是在版本1.5(2008年7月26日)中添加的,而when()
是在版本1.6(2008年10月21日)中增加的。用when()
代替旧的stub()
方法,用doReturn()
代替stubVoid()
方法。基本上,这是Mockito的创建者的设计指示(引用自2008年6月29日的邮件列表):
我从来都不喜欢stubVoid()语法,但这是我能想到的最好的语法属于如果我再次执行mockito,我现在将实现的存根语法:
//定期清理:when(mock.getStuff()).thenReturn("foo");
when(mock.getStuff()).thenThrow(new RuntimeException());
//对于void方法和某些拐角情况:doReturn("foo").when(mock).getStuff();
doThrow(new RuntimeException()).when(mock).someMethod();
//对于连续的存根:when(mock.getStuff()).thenReturn("foo").thenThrow(new RuntimeException());
doThrow(new RuntimeException()).thenReturn("foo").when(mock).someMethod();
我几周前提出了这个语法,但只收到了一个反馈说这是化妆品(这是真的…)。因此我决定不更改API。
正如Bewusstssein在评论中指出的那样,when()
提供了类型安全性。如果我们有一个方法String doSomething()
,下面的两个块都将编译。但是,后者将在运行时抛出异常。
Mockito.doReturn("String").when(mock).doSomething();
Mockito.doReturn(1).when(mock).doSomething();
因此,总结一下,引入两种嘲讽方式是一个设计决定。when()
由于其类型安全性和流畅的阅读能力而被认为是首选的嘲讽方式。实现CCD_ 16是为了允许对CCD_ 17方法和其他拐角情况进行模拟。