Saltar al contenido

Usando el método genérico “any()” de Mockito

Después de investigar con expertos en el tema, programadores de diversas áreas y profesores dimos con la solución al problema y la compartimos en este post.

Solución:

Esto debería funcionar

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.verify;

verify(bar).DoStuff(any(Foo[].class));

Desde Java 8 puedes usar el argumento sin argumentos any El método y el argumento de tipo serán deducidos por el compilador:

verify(bar).doStuff(any());

Explicación

Lo nuevo en Java 8 es que el tipo de objetivo de una expresión se utilizará para inferir los parámetros de tipo de sus subexpresiones. Antes de Java 8, solo los argumentos de los métodos se usaban para la inferencia de parámetros de tipo (la mayoría de las veces).

En este caso, el tipo de parámetro de doStuff será el tipo de destino para any()y el tipo de valor de retorno de any() será elegido para que coincida con ese tipo de argumento.

Este mecanismo se agregó en Java 8 principalmente para poder compilar expresiones lambda, pero mejora las inferencias de tipos en general.


tipos primitivos

Esto no funciona con tipos primitivos, desafortunadamente:

public interface IBar 
    void doPrimitiveStuff(int i);


verify(bar).doPrimitiveStuff(any()); // Compiles but throws NullPointerException
verify(bar).doPrimitiveStuff(anyInt()); // This is what you have to do instead

El problema es que el compilador inferirá Integer como el tipo de valor de retorno de any(). Mockito no se dará cuenta de esto (debido al borrado de tipos) y devolverá el valor predeterminado para los tipos de referencia, que es null. El tiempo de ejecución intentará desempaquetar el valor de retorno llamando al intValue en él antes de pasarlo a doStuffy se lanza la excepción.

Puedes usar Mockito.isA() para eso:

import static org.mockito.Matchers.isA;
import static org.mockito.Mockito.verify;

verify(bar).doStuff(isA(Foo[].class));

http://site.mockito.org/mockito/docs/current/org/mockito/Matchers.html#isA(java.lang.Class)

valoraciones y reseñas

Tienes la opción de añadir valor a nuestro contenido informacional asistiendo con tu veteranía en las crónicas.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *