根据THIS帖子,有两种方法可以模拟方法doSomeStuff()返回1:
when(bloMock.doSomeStuff()).thenReturn(1);
和
doReturn(1).when(bloMock).doSomeStuff();
非常重要的区别在于第一个选项实际上是 调用doSomeStuff() - 方法,而第二个不会
所以,我的问题是,第一个选项实际调用实际方法但仅返回1是什么意思。在哪个用例中,我们可能想要这样的东西?
答案 0 :(得分:1)
我挖掘的内容比这更多,并且可以在旧的release notes和引用的mailing list discussion中找到两种语法存在的答案。
首先,在版本1.5(26/07/2008)中添加了doReturn()
,而在版本1.6(21/10/2008)中添加了when()
。已实施when()
以替换旧的stub()
方法和doReturn()
以替换stubVoid()
。基本上这是Mockito创作者的设计决定(引自邮件列表29/06/2008):
我从不喜欢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。
正如Bewusstsein在评论中已经指出的那样,when()
提供了类型安全性。如果我们有一个方法String doSomething()
,则下面的两个块都将编译。然而,后者将在运行时抛出异常。
Mockito.doReturn("String").when(mock).doSomething();
Mockito.doReturn(1).when(mock).doSomething();
因此,总而言之,引入两种模拟方式是一项设计决策。由于其类型安全性和流畅的阅读,when()
被认为是首选的嘲弄方式。 doReturn()
已实施,允许模拟void
方法和其他极端情况。