Saltar al contenido

¿Cuál es la diferencia entre Mockito Matchers isA, any, eq y same?

Por fin luego de tanto batallar ya encontramos la solución de esta aprieto que ciertos de nuestros lectores de esta web han tenido. Si deseas aportar algo no dudes en compartir tu información.

Solución:

  • any() no comprueba absolutamente nada. En Mockito 1.x, any(T.class) tampoco verifica absolutamente nada, pero también le ahorra un lanzamiento (antes de Java 8).

    Esto se debe a cambios en Mockito 2.0 y posteriores, cuando any(T.class) Va a compartir isA semántica para significar “cualquier T” o correctamente “cualquier instancia de tipo T“. any() seguirá comprobando absolutamente nada.

  • isA(T.class) comprueba que el argumento instanceof Tlo que implica que no esnull.

  • same(obj) comprueba que el argumento es la misma instancia que objtal que arg == obj es true.

  • eq(obj) comprueba que el argumento es igual obj de acuerdo a su equals método. Este también es el comportamiento si pasa valores reales sin usar comparadores.

    Tenga en cuenta que a menos que equals se anula, verá la implementación predeterminada de Object.equals, que tendría el mismo comportamiento que same(obj).

Si necesita una personalización más exacta, puede usar un adaptador para su propio predicado:

  • Para Mockito 1.x, use argThat con un Hamcrest personalizado Matcher que selecciona exactamente los objetos que necesita.
  • Para Mockito 2.0 y posteriores, use Matchers.argThat con una costumbre org.mockito.ArgumentMatchero MockitoHamcrest.argThat con un Hamcrest personalizado Matcher.

Si su Request.class implementa iguales, entonces puede usar eq():

Bar bar = getBar();
when(fooService.fooFxn(eq(bar)).then...

Lo anterior cuando se activaría en

fooService.fooFxn(otherBar);

si

otherBar.equals(bar);

Alternativamente, si desea que el simulacro funcione para algún otro subconjunto de entrada (por ejemplo, todas las barras con Bar.getBarLength()>10), puede crear un Matcher. No veo este patrón con demasiada frecuencia, por lo que normalmente creo el Matcher como una clase privada:

private static class BarMatcher extends BaseMatcher
...//constructors, descriptions, etc.
  public boolean matches(Object otherBar)
     //Checks, casts, etc.
     return otherBar.getBarLength()>10;
  

Entonces usaría este comparador de la siguiente manera:

when(fooService.fooFxn(argThat(new BarMatcher())).then...

¡Espero que ayude!

Reseñas y puntuaciones

Eres capaz de añadir valor a nuestra información colaborando tu veteranía en las interpretaciones.

¡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 *