2017-03-02 63 views
1

我使用它的形式的方法的第三方庫:懲戒與捕獲的泛型返回一個迭代的方法

public interface ThirdPartyMessageThing<T> { 
    Iterator<? extends MessageEntry<T>> getMessages(){} 
} 

我試圖嘲弄調用的getMessages()返回一個模擬的迭代器,所以我可以控制使用Mockito的行爲hasNext()next()

我有一個嘲笑的ThirdPartyMessageThing<String>對象叫做thirdPartyMessageThing

如果我試圖嘲弄迭代器,像這樣:

Iterator<MessageEntry<String>> mockedIterator = Mockito.mock(Iterator.class); 

的模擬似乎是好的,直到我嘗試它作爲一個呼叫模擬在返回when()

when(thirdPartyMessageThing.getMessages()).thenReturn(mockedIterator); 

編譯器不喜歡這樣說,它不能解決該方法。

我得到同樣的行爲,如果我用我的IDE的自動完成從該方法我試圖模擬一個呼叫產生的局部變量:

Iterator<? extends MessageEntry<String>> mockedIterator = 
           thirdPartyMessageThing.getMessages(); 

,並嘗試使用,作爲參數thenReturn() 。 但是,如果我只是將mock(Iterator.class)作爲參數放入thenReturn(),編譯器不會發出抱怨,但我無法訪問Iterator以覆蓋它的方法。

我該如何嘲笑這個迭代器,以便我可以將它用作模擬並覆蓋它的方法?

回答

1

我將其標記爲this question的副本,因爲我找到了一種讓它工作的方法。

爲了參考,我最終做的是構造一個虛擬列表<>並返回該迭代器。如果您使用doReturn(returnValue).when(mockedObject).methodName()語法,這將起作用。

另一種我也發現工作的機制是將泛型迭代器轉換爲一個普通的迭代器,但是這會引發關於未經檢查的異常的警告。