2015-10-28 51 views
2

我試圖嘲笑一個類,並返回一個方法模擬對象被調用時的對象的存根列表。讓我們考慮下面的代碼:Mockito不正確存根方法採取列表作爲參數

interface MyRepositry{ 
     public List<MyClass> getMyClassInstances(String str,Long id,List<Integer> statusList); 
} 

我嘲笑上述方法ivocation如下:

when(myRepository.getMyClassInstances("1234", 200L, stubbedList)).thenReturn(stubbedMyClassInstanceList); 

其中

stubbedList 

是我創建的列表中插入兩個整數1和3。真正的調用也通過我構造的具有整數1和3的列表。這裏指出的是stubbedList對象和實際調用中的列表對象是不同的,但總是包含兩個整數1和3.

stubbedMyClassInstanceList  

是MyClass實例的存根列表。

但是當我運行測試時,mockito返回一個空的列表。我做了一些調試,我想是的Mockito無法匹配,我使用

 when(..).thenReturn(..) 

呼叫並在實際通話,因此沒有找到正確的簽名列表對象。

我不能使用

anyList() 

匹配器作爲我總是傳遞兩個整數的列表(1和3)。

 class StatusMatcher extends ArgumentMatcher<List> { 
    public boolean matches(Object list) { 
     List statuses = ((List) list); 
     return (statuses.size() == 2 && statuses.contains(1) && statuses.contains(3)); 
    } 
} 

所以,問題是::

1)是我講爲什麼磕碰/嘲諷不是猜測

我已經通過如下使用自定義

 ArgumentMatcher 

解決問題工作正確嗎? 2)並且我使用的解決方案是否正確?

+0

請提供一個完整的(但很簡單)工作示例來說明問題。 – Tunaki

+0

我無法提供實際的代碼,因爲它是授權給我工作的公司的。不過,我已經給出了最小的相關代碼。如果你沒有發現任何上述代碼足夠解釋,我可以解釋更多。 –

回答

4

自然的Mockito使用equals()的參數匹配。 List<T>中的equals()方法指定如果兩個列表按相同順序包含相同元素,則它們被定義爲相等。

您的自定義參數匹配器,您說的作品,不考慮秩序。

所以也許1和3在List<T>錯誤的順序?

+1

或者'List'是不同的類型。 – Tunaki

+0

我的自定義匹配器不檢查順序它只是檢查它是否包含正確的元素 –

+0

列表是相同類型,即整數對象的Arraylist –

0

具有的Mockito的EQ()方法

你可以嘗試:

import static org.mockito.Matchers.eq; 

..... 

when(myRepository.getMyClassInstances(eq("1234"), eq(200L), eq(stubbedList)).thenReturn(stubbedMyClassInstanceList); 
+0

我試過列表上的eq(),但無濟於事 –

相關問題