mock method examples java unit-testing mocking mockito

java - method - mockito spy



Usando el método genérico "any()" de Mockito (4)

Tengo una interfaz con un método que espera una matriz de Foo :

public interface IBar { void doStuff(Foo[] arr); }

Me estoy burlando de esta interfaz usando Mockito, y me gustaría afirmar que se llama a doStuff() , pero no quiero validar qué argumento se pasa: "no me importa".

¿Cómo escribo el siguiente código usando any() , el método genérico, en lugar de anyObject() ?

IBar bar = mock(IBar.class); ... verify(bar).doStuff((Foo[]) anyObject());


Como necesitaba usar esta característica para mi último proyecto (en un momento lo actualizamos desde 1.10.19), solo para mantener a los usuarios (que ya están usando la versión de mockito-core 2.1.0 o superior ) actualizados, la estática los métodos de las respuestas anteriores deben tomarse de la clase ArgumentMatchers :

import static org.mockito.ArgumentMatchers.isA; import static org.mockito.ArgumentMatchers.any;

Tenga esto en cuenta si planea mantener sus artefactos de mockito actualizados, posiblemente comenzando con la versión 3, esta clase puede que ya no exista:

Según 2.1.0 y superior, javadoc de org.mockito.Matchers afirma:

Use org.mockito.ArgumentMatchers . Esta clase ahora está en desuso para evitar un conflicto de nombres con la clase de Hamcrest * org.hamcrest.Matchers . Es probable que esta clase se elimine en la versión 3.0.


Desde Java 8 puede usar el método sin argumento y el compilador inferirá el argumento de tipo:

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

Explicación

Lo nuevo en Java 8 es que el tipo de destino de una expresión se usará para inferir parámetros de tipo de sus sub-expresiones. Antes de Java 8, solo los argumentos a 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 se elegirá el tipo de valor de retorno de any() para que coincida con ese tipo de argumento.

Tipos primitivos

Esto no funciona con los 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 deducirá Integer como el valor de retorno de any() . Mockito no se dará cuenta de esto (debido a borrado de tipo) y devolverá el valor predeterminado para los tipos de referencia, que es null . El tiempo de ejecución intentará desempaquetar el valor devuelto llamando al método intValue y se lanzará la excepción.


Esto debería funcionar

import static org.mockito.Matchers.any; import static org.mockito.Mockito.verify; verify(bar).DoStuff(any(Foo[].class));