2014-02-14 106 views
9

我試圖驗證具有以下簽名的方法被稱爲:的Mockito anyMapOf嵌套泛型

public void process(Map<String, Set<String>> data) { 
    ... 
} 

嵌套的參數設置導致了我的困難。我可以得到它,象這樣的任何()匹配正確驗證:

verify(dataProcessor).process(Matchers.<Map<String, Set<String>>> any()); 

Mockito: Verifying with generic parameters描述雖然煩人,如果我做Matchers.any的直接靜態導入它不工作和叫它:

verify(dataProcessor).process(<Map<String, Set<String>>> any()) 

但anyMapOf(clazz所clazz所),似乎在這種情況下,更合適的匹配。既然你不能Set.class,我不知道你會怎麼做。下面,由於缺乏通用不起作用:

verify(dataProcessor).process(anyMapOf(String.class, Set.class)); 

是否可以驗證與anyMapOf這種情況下還是應該堅持匹配器。 <> any()?

+0

您的方法簽名已經約束了方法使用的參數類型,爲什麼不使用'any()'?代碼不會用'Map >'調用你的方法,甚至不會編譯... – fge

+0

@fge Java類型推斷不會根據'any'中提供的參數類型推斷'any'過程「,因爲」過程「可能有重載和/或自己的類型參數。它會在返回值和字段中這樣做,因爲該類型已經明確定義爲返回值類型或字段類型。這些都在[極其不透明的JLS 15.12.2](http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.12.2)中。 –

回答

15

沒有辦法使用anyMapOf來做到這一點。它旨在幫助簡單地將簡單類映射到Java 7中的簡單類,並且您的工作比這更簡單。

Java 8參數推斷得到改進,因此在Java 8中,您可以使用any()

verify(dataProcessor).process(Matchers.any()); 

除非,爲了使這一下最好的辦法是要麼喜歡你在上面寫道:

verify(dataProcessor).process(Matchers.<Map<String, Set<String>>>any()); 

或者通過提取匹配的靜態功能,這使Java只是足夠的信息,它需要推斷類型自身:

@Test public void yourTest() { 
    // ... 
    verify(dataProcessor).process(anyStringSetMap()); 
} 

private static Map<String, Set<String>> anyStringSetMap() { 
    return any(); 
} 

(警告:需要注意的是的anyStringMap返回值是零;它的side-effect of calling any that you're looking for的提取方法只是通知預期返回類型的Java編譯器;注意做更有趣的事情可能會以非常有趣的方式破譯)。

+0

謝謝傑夫,很高興在此得到確認。如果它在這個項目中成爲一個常見的案例,那麼也許我會去新的靜態匹配器的方向。 – Ben