2015-04-02 76 views
1

我正在學習GwtMockito,但無法在我的一個測試中獲得一致的verify()方法。Mockito驗證方法沒有給出一致的結果

我想測試正確的GwtEvents正在被我的應用程序解僱。所以,我嘲笑事件總線像這樣在我的@Before方法:

eventBus = mock(HandlerManager.class); 

該測試通過預期:

// Passes as expected 
verify(eventBus).fireEvent(any(ErrorOccurredEvent.class)); 

我想迫使測試只是不知道它是運行正確。所以我改變了它,它仍然通過:

// Expected this to fail, but it passes 
verify(eventBus).fireEvent(any(ErrorOccurredEvent.class)); 
verifyZeroInteractions(eventBus).fireEvent(any(ErrorOccurredEvent.class)); 

這似乎與我矛盾。所以我刪除了第一個測試:

// Fails as expected 
verifyZeroInteractions(eventBus).fireEvent(any(ErrorOccurredEvent.class)); 

最後,我添加了一個不相關的事件應該導致失敗

// Expected to fail, but passes 
verify(eventBus).fireEvent(any(ErrorOccurredEvent.class)); 
verify(eventBus).fireEvent(any(ModelCreatedEvent.class)); // This event is not used at all by the class that I'm testing. It's not possible for it to be fired. 

我沒有找到,說明發生了什麼事情的任何文件。 ErrorOccurredEvent和ModelCreatedEvent都擴展了GwtEvent,並且已經在手動測試中驗證過。我是否錯誤地測試了我的EventBus?如果是這樣,那麼有什麼更好的辦法呢?

更新

我已經做了一些額外的實驗。這似乎是我與Mockito匹配的問題。當我的測試失敗時,異常報告的方法簽名爲eventBus.fireEvent(<any>),所以它似乎沒有考慮到我傳入任何方法的不同類。不知道該怎麼做,但包括它在這裏爲其他人研究這個問題。

回答

1

您正在查找的方法是isA,而不是any

0

這並不能解釋我第一次強迫測試失敗的嘗試,但它確實解釋了其他混淆。從文檔的Mockito:

公共靜態Ť任何(java.lang.Class中clazz所)

匹配任何對象,包括空值

該方法不執行類型檢查用給定的參數,它只有 ,以避免在代碼中投射。然而,這可能會在未來的主要版本中更改 (可能會添加類型檢查)。

所以通過設計它不會做我希望的類型檢查。我將不得不找出另一種方法來設計這些測試。但這解釋了他們爲什麼不像我預期的那樣行事。