2016-08-02 60 views
0

我有以下接口:Mockito - 如何使用列表匹配器限制列表類型?

public interface ListHandler { 

    public boolean add(List<?> list, Object element); 

} 

對於那些想在一個測試,以確保它僅接收具有特定的類型,例如,String的列表。我已經編碼了以下測試:

@Test 
public void testAddOnlyString() { 
    boolean actual = false; 

    when(this.listHandlerMock.add(
     Matchers.anyListOf(String.class), 
     Matchers.anyString() 
    )).thenReturn(true); 

    actual = this.listHandlerMock.add(new ArrayList<Integer>(), 1); 
    assertTrue(actual); 

    verify(this.listHandlerMock).add(
     Matchers.anyListOf(String.class), 
     Matchers.anyString() 
    ); 
} 

但測試通過正確。

+0

由於泛型類型的擦除,所以您不知道運行時的泛型類型。我猜'anyListOf'匹配器會檢查列表中的所有元素是否屬於這種類型,但是由於列表是空的,因此它永遠不會失敗。無論如何,你知道你傳遞了什麼名單 - 你爲什麼在任何名單上聲稱?只需提取到'list = new ArrayList ',並期望相同的對象:'sameInstance(list)' –

+0

順便說一下,你的實際對象在哪裏?所有的測試正在與模擬進行交互。你在這裏測試什麼? –

回答

2

簡答:你不能。對於列表類型在編譯時(類型擦除) 清洗作爲一個例子,這將打印true

System.out.println(new ArrayList<Integer>().equals(new ArrayList<String>())); 
Matchers.anyListOf文檔

另外:

此方法不做任何類型檢查,它只是在那裏,以避免 鑄造您的代碼。

如果列表不是空的,您可以構建一個匹配器來檢查每個條目是否具有您期望的類型,但對於空列表,您無能爲力。

+0

那麼,這些匹配者的目標是什麼? – Julen

+0

@Julen通用友好別名{@link Matchers#anyList()}。 它是SuppressWarnings(「unchecked」)的替代方案,可以保持代碼清理編譯器警告。 – user1121883

+0

警告是如何產生的?我試圖複製它來理解匹配器的意義。 – Julen