2014-06-24 49 views
5

我正在嘗試將部分使用JMock的單元測試轉換爲使用Mockito,並且遇到了一些絆腳石。Mockito vs JMock

在我的測試使用JMock的當驗證和短截線的返回發生在一個步驟如下

contextMockery.checking(new Expectations() {{ 
     oneOf(dateUtilityService).isBeforeToday(URGENT_DATE); 
      will(returnValue(true)); 
    }}); 

這基本上驗證方法被調用並返回同時罐裝值

首先。如果isBeforeToday方法未被調用,則測試將失敗,並同時返回我的罐頭值爲true。使用的Mockito時,我卻以驗證該方法被調用,然後在單獨的步驟,這是相當多的重複如下回到我的罐頭值:

doReturn(true).when(dateUtilityService).isBeforeToday(URGENT_DATE); 
    verify(dateUtilityService).isBeforeToday(URGENT_DATE); 

難道就沒有辦法一步到位做到這一點?其次,如果我忘記在我的期望中列出一個方法調用我的一個嘲笑,JMock通過「意外的調用異常」失敗了,這在我看來是正確的,而Mockito會很樂意通過測試,除非我明確驗證一個方法調用模擬一定不會發生,這是正確的(似乎是錯誤的)?有沒有辦法告訴mockito如果對我的模擬出的依賴關係進行了意外的方法調用,從而無法通過測試?

+0

只是出於好奇,你也可以考慮轉換測試JMockit?語法更接近jMock's:'new Expectations(){{dateUtilityService.isBeforeToday(URGENT_DATE);結果= true; }};'。 –

回答

5

1.

當存根方法調用驗證方法通常是沒有必要的 - 你應該檢查基礎上,返回值的動作(在一些情況下會發生什麼將返回當dateUtilityService回報真的 - 檢查的,而不是檢驗了模擬的互動

文檔的Mockito也談到了這個http://site.mockito.org/mockito/docs/current/org/mockito/Mockito.html#2

2.

這實際上導致。脆弱的測試,並不推薦與mockito做事的方式。這就是爲什麼沒有辦法設置這種行爲。

http://site.mockito.org/mockito/docs/current/org/mockito/Mockito.html#8

+0

因此,在存根改變返回類型的值時,在某些情況下(如我所示的)有意義。但正如我在我的問題的第二部分中提到的,如果我忘記在我的測試中存根方法調用(可能不會改變任何返回值),我想知道它,以便我可以做出明智的選擇存根電話或告訴測試它永遠不應該被調用。 –

+1

@ClintonBosch您可以在測試方法末尾添加對'verifyNoMoreInteractions()'的調用,以檢測任何未打擾的調用。 –

+0

自從我開始使用Mockito(我從2007年開始使用JMock,甚至在...之前...我不記得了),我注意到綠色測試在同事忘記調用合作者的情況下,我聽到像「單元測試有時會給你誤報,最好是進行集成測試「。也許,最好使用像JMock這樣的工具,並試圖以另一種方式避免「脆弱測試」,而不是像Mockito那樣使用如此薄弱的設計工具。 – sixro