2014-02-14 2 views
9

ich, dass ein Verfahren mit der folgenden Signatur zu verifizieren versucht bin, genannt wurde:Mockito anyMapOf verschachtelt Generika

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

Die verschachtelte parametrisierte Set me Schwierigkeiten verursacht. Ich kann es richtig, wie so mit dem jede() Matcher zu überprüfen erhalten:

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

Wie in Mockito: Verifying with generic parameters beschrieben, obwohl annoyingly es nicht funktioniert, wenn ich eine direkte statische Import von Matchers.any tun und nennen Sie es, wie gerade :

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

Aber anyMapOf (clazz, clazz) scheint die geeignetere Matcher in diesem Fall. Da Sie Set.class nicht tun können, bin ich mir nicht sicher, wie Sie das machen würden. Die folgende funktioniert nicht, weil der Mangel an generic:

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

Ist es möglich, diese Situation mit anyMapOf zu überprüfen, oder sollte ich Stick mit Matchers. <> any()?

+0

Deine Methodensignatur schränkt bereits ein, welchen Argumenttyp die Methode verwendet, warum verwendest du nicht 'any()'? Code, der Ihre Methode nicht mit einer 'Map >' aufruft, kompiliert nicht einmal ... – fge

+0

@fge Java-Typ-Inferenz leitet keine Typvariablen im Aufruf von 'any' basierend auf den in' 'verfügbaren Parametertypen ab process', weil 'process' Überladungen und/oder eigene Typparameter haben könnte. Dies geschieht in Rückgabewerten und Feldern, da der Typ bereits explizit als Rückgabewerttyp oder Feldtyp definiert ist. Es ist alles in [der extrem undurchsichtigen JLS 15.12.2] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.12.2). –

Antwort

15

Es gibt keine Möglichkeit anyMapOf dafür zu verwenden. Es wurde entwickelt, um mit dem einfachen Fall der Zuordnung einfacher Klassen zu einfachen Klassen in Java 7 zu helfen, und Ihre ist komplexer als das.

Java 8 Parameter Inferenz verbessert, so in Java 8, können Sie einfach any() verwenden.

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

dass Barring, der beste Weg, diesen Blick zu machen, ist entweder, wie Sie oben geschrieben habe:

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

Oder durch die Matcher auf eine statische Funktion zu extrahieren, die Java gibt gerade genug Informationen, muss es folgern die Art auf seine eigene:

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

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

(Caveat. Beachten sie, dass der Rückgabewert von anyStringMap null ist, es ist die side-effect of calling any that you're looking for ist das extrahierte Methode nur zu informieren, ist die Java-Compiler vom erwarteten Rückgabetyp; pass auf, dass es etwas wirklich Interessanteres macht, etwas interessanter zu machen.

+0

Dank Jeff, es ist gut, eine Bestätigung dafür zu bekommen. Wenn es in diesem Projekt ein genug häufiger Fall wird, dann werde ich vielleicht die Richtung des neuen statischen Matcher gehen. – Ben