2011-05-30 109 views
59

隨着我的Mockito驗證可以做到以下幾點:的Mockito:與泛型參數

verify(someService).process(any(Person.class)); 

但我怎麼寫這個,如果process需要Collection<Person>呢?無法弄清楚如何正確編寫它。只是得到語法錯誤...

回答

102

嘗試:

verify(someService).process(Matchers.<Collection<Person>>any()); 

事實上,自動的IntelliJ當我輸入any() ...可惜你不能在這種情況下使用靜態導入建議此修復程序。

+0

這似乎工作! – Svish 2011-05-30 11:55:31

+4

感謝它的工作......但上帝看起來很可怕,必須有一個更好的方式來對... – 2013-01-10 19:01:25

+1

豎起大拇指上唯一的解決方案,回答問題的陳述,而不是針對匹配容器的特殊情況。 – 2013-11-15 04:07:01

-1

由於類型擦除你不能表達。即使你可以用代碼表達它,Mockito也沒有機會在運行時檢查它。你可以創建一個接口,如

interface PersonCollection extends Collection<Person> { /* nothing */ } 

改爲在整個代碼中使用它。

編輯:我錯了,Mockito有anyCollectionOf(..)這就是你想要的。

+1

實際上,如果API接受它,它*可以用「類型文字」對象表示:'any(new TypeLiteral >(){})''。當然不是很漂亮,但它確實有效,因爲所有的類型信息在運行時都可用(通過反射或字節碼庫)。 – 2011-05-30 11:49:54

+0

@Rogerio:你說的對,現在看來Mockito的確支持這一點。有一段時間沒有使用它... – Waldheinz 2011-05-30 11:56:15

21

嘗試:

verify(someService).process(anyCollectionOf(Person.class)); 

由於版本1.8的Mockito介紹

public static <T> Collection<T> anyCollectionOf(Class<T> clazz); 
+0

對於其他需要它的人來說,除了anyCollectionOf(),還有一個anyListOf(),請參閱:http://stackoverflow.com/a/10512526/908677 – 2016-08-16 18:47:34

+0

anyCollectionOf(類 clazz)將被刪除Mockito 3.0和java8。將會有一個新的方法:anyOptional(類類)請參閱:https://github.com/mockito/mockito/issues/308 – Naxos84 2018-01-09 11:15:15

1

,如果您使用的是自己的方法,你甚至可以使用靜態導入:

private Collection<Person> anyPersonCollection() { 
    return any(); 
} 

然後你可以使用

verify(someService).process(anyPersonCollection());