java generics mocking mockito

java - Mockito anyMapOf genéricos anidados



generics mocking (1)

No hay forma de usar anyMapOf para hacer esto. Está diseñado para ayudar con el simple caso de asignar clases simples a clases simples en Java 7 , y el tuyo es más complejo que eso.

La inferencia de los parámetros de Java 8 mejoró, por lo que en Java 8, puedes simplemente usar any() .

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

Salvo eso, la mejor manera de hacer este look es como usted escribió arriba:

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

O al extraer el matcher a una función estática, que proporciona a Java la información suficiente que necesita para inferir el tipo por sí mismo:

@Test public void yourTest() { // ... verify(dataProcessor).process(anyStringSetMap()); } private static Map<String, Set<String>> anyStringSetMap() { return any(); }

(Advertencia: anyStringMap cuenta que el valor de retorno de anyStringMap es nulo, es el efecto secundario de llamar a any que esté buscando . El método extraído es solo para informar al compilador de Java del tipo de retorno esperado; tenga en cuenta que haciendo cualquier cosa más elegante probablemente rompa formas realmente bastante interesantes.)

Estoy intentando verificar que se llamó un método con la siguiente firma:

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

El conjunto parametrizado anidado me está causando dificultades. Puedo hacer que verifique correctamente con el matcher any () así:

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

Como se describe en Mockito: Verificación con parámetros genéricos aunque molestamente no funciona si hago una importación estática directa de Matchers.any y la llamo simplemente:

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

Pero anyMapOf (clazz, clazz) parece el más apropiado en este caso. Como no puedes hacer Set.class, no estoy seguro de cómo harías esto. Lo siguiente no funciona debido a la falta de genéricos:

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

¿Es posible verificar esta situación con anyMapOf o debería seguir con Matchers. <> Any ()?