2013-10-15 38 views
2

我正在做一些測試驅動的開發,並將Mockito verify()調用添加到我的測試用例中(如更改名稱以保護無辜代碼) :Mockito:使用模擬參數調用verify()不會觸發失敗

Api api = mock(Api.class); 
Thing thing = mock(Thing.class); 
when(thing.getId()).thenReturn(1); 

// later... 
verify(api).doAThingWithAThingId(thing.getId()) 

雖然我還沒有添加通話api.doAThingWithAThingId()我的代碼,這個測試用例通過!但是,當我這樣做時...

int id = thing.getId(); 
verify(api).doAThingWithAThingId(id); 

驗證未按預期進行。什麼導致了這種行爲?

(根據記錄,這是使用的Mockito,1.8.4的稍舊的版本。)

回答

6

我剛剛與1.9.5的Mockito運行此,我無法重現你已經行爲描述。但我相信我知道爲什麼它可能發生在舊版本中。

Mockito具有影響其模擬行爲的「樁模式」和「驗證模式」,並根據需要在這些模式之間切換。所以當你寫verify時,Mockito切換到驗證模式。對模擬方法的下一次調用會執行驗證,而不是執行存根操作,但它也會將Mockito從驗證模式切換出來。

所以當你寫verify(api).doAThingWithAThingId(thing.getId())時,Mockito 1.8.4進入驗證模式;但撥打thing.getId()則將其輸出爲verify模式。然後致電doAThingWithAThingId從未實際得到驗證。

道德 - 在任何版本的Mockito中,都不會調用任何模擬方法,在verify之後的調用參數中。在開始驗證之前評估你需要的參數。

+0

感謝您的簡短解釋。我經常被Mockito和'持續存在'困擾。 –

+0

是的,我通過一個簡單的測試驗證了這一點,發生在Mockito 1.8。*中,但不在Mockito 1.9中。學過的知識! – aarestad

+0

還有一點信息,這實際上是一個已知的缺陷,在1.8.5中已修復:https://code.google.com/p/mockito/issues/detail?id=138 – aarestad

相關問題