Pregunta

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

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

estoy burlando de esta interfaz utilizando Mockito, y me gustaría afirmar que doStuff() se llama, pero no desea validar qué argumento se pasa -. "No importa"

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

IBar bar = mock(IBar.class);
...
verify(bar).doStuff((Foo[]) anyObject());
¿Fue útil?

Solución

Desde Java 8 se puede utilizar el método any argumento de menos y el argumento de tipo conseguirá inferida por el compilador:

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

Explicación

Lo nuevo en Java 8 es que el tipo de destino de una expresión se usa para parámetros de tipo inferir de sus sub-expresiones. Antes de Java 8 únicos argumentos a los métodos donde se utilizan para el parámetro Tipo de inferencia (la mayor parte del tiempo).

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() conseguirá elegido para que coincida con el tipo de argumento.


Los tipos primitivos

Esto no funciona con tipos primitivos, por desgracia:

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 valor de retorno de any(). Mockito no será consciente de ello (según el tipo de borrado) y devolver el valor predeterminado para los tipos de referencia, que es null. El tiempo de ejecución tratará de desempacar el valor devuelto por la llamada al método intValue en él antes de pasarla a doStuff, y la excepción es lanzada.

Otros consejos

Esto debería funcionar

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

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

Puede utilizar Mockito.isA() de que:

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)

A medida que necesitaba usar esta función para mi último proyecto (en un momento hemos actualizado desde 10/01/19), sólo para mantener a los usuarios (que ya están utilizando el Mockito núcleo versión 2.1.0 o superior ) hasta la fecha, los métodos estáticos de las respuestas anteriores deben tomarse de la clase ArgumentMatchers:

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

Por favor, tenga esto en cuenta si usted está planeando para mantener sus artefactos Mockito hasta la fecha como, posiblemente, a partir de la versión 3, esta clase ya no existe:

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

  

Uso org.mockito.ArgumentMatchers. Esta clase está obsoleto con el fin de   evitar un choque con el nombre de Hamcrest * org.hamcrest.Matchers   clase. Esta clase es probable que se elimina en la versión 3.0.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top