与Mockito一起进行间谍活动

时间:2016-04-06 04:08:33

标签: mockito spy

根据THIS帖子,有两种方法可以模拟方法doSomeStuff()返回1:

when(bloMock.doSomeStuff()).thenReturn(1);

doReturn(1).when(bloMock).doSomeStuff();
  

非常重要的区别在于第一个选项实际上是   调用doSomeStuff() - 方法,而第二个不会

所以,我的问题是,第一个选项实际调用实际方法但仅返回1是什么意思。在哪个用例中,我们可能想要这样的东西?

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方法和其他极端情况。