2016-04-06 40 views
0

刺探按THIS後,有兩種方法來模擬方法doSomeStuff()返回一個1:用的Mockito

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

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

非常重要的區別是,第一個選項實際上是 調用doSomeStuff() - 方法,而第二個將不會

所以,我的問題是有什麼要點在實際調用實際方法的第一個選項,但只返回1。在哪個用例中,我們可能想要這樣的東西?

+2

可能的重複:http://stackoverflow.com/questions/20353846/mockito-difference-between-doreturn-and-當 – troig

+1

其實我仔細閱讀你的問題。但是,我從來沒有聽說過你所指派的差異(我剛剛注意到這是我的鏈接問題的答案之一)。無論如何,我會等待答案。感謝評論:) – troig

+2

也認爲這是一個重複的問題,你的問題'接受第一個選項'的問題在接受的答案中得到了回答:'當/然後返回給你,有一件事返回/當沒有時,是在編譯時對你返回的值進行類型檢查。# – Bewusstsein

回答

1

我挖了一點比這更多,爲什麼這兩種語法存在的答案可以在舊的release notes和引用的mailing list discussion中找到。

首先,在版本1.5(26/07/2008)中添加了doReturn(),而在版本1.6(21/10/2008)中添加了when()。執行when()以取代舊的stub()方法和doReturn()以取代stubVoid()。基本上,這是用的的Mockito的創作者設計deicision(從郵件列表29/06/2008引用):

我從來不喜歡stubVoid()語法,但是這是我能想到的 最好的。該存根語法我現在想實現,如果我再一次的Mockito做:

//經常磕碰:

when(mock.getStuff()).thenReturn("foo");
when(mock.getStuff()).thenThrow(new RuntimeException());

爲無效的方法和一些極端情況//:

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方法和其他角落案例。