Estoy tratando de probar un código heredado, usando Mockito.
Quiero tropezar con uno FooDaoque se usa en producción de la siguiente manera:
foo = fooDao.getBar(new Bazoo());
Puedo escribir:
when(fooDao.getBar(new Bazoo())).thenReturn(myFoo);
Pero el problema obvio es que getBar()nunca se llama con el mismo Bazooobjeto para el que calculé el método. (¡Maldición a ese newoperador!)
Me encantaría si pudiera tropezar el método de una manera que regrese myFooindependientemente del argumento. De lo contrario, escucharé otras sugerencias de solución, pero realmente me gustaría evitar cambiar el código de producción hasta que haya una cobertura de prueba razonable.
java
unit-testing
mocking
mockito
Eric Wilson
fuente
fuente

notNull(Bazoo.class)así comoany(Bazoo.class)(tal vez no existía en el momento de esta respuesta)BazoooCazoolos que son ambas subclases de, por ejemplo,Azoo. porqueBazoonecesitaba regresarfoo, pero porqueCazoonecesitaba regresarbar. En esta situación, laMatchers.any()solución propuesta no funciona, sin embargo,Matchers.isA()funciona perfectamente.org.mockito.Matchersahora está en desuso - useorg.mockito.ArgumentMatchersen su lugar, es decirimport static org.mockito.ArgumentMatchers.*(ver documentos )when(myFoo.knowsWhatsUp()).thenReturn(myMoney);Usar así:
Antes de que necesites importar
Mockito.Matchersfuente
http://site.mockito.org/mockito/docs/1.10.19/org/mockito/Matchers.html
anyObject()debe ajustarse a tus necesidades.Además, siempre puede considerar implementar
hashCode()yequals()para laBazooclase. Esto haría que su ejemplo de código funcione de la manera que desee.fuente
Otra opción es confiar en un buen
equalsmétodo antiguo . Mientras el argumento en elwhensimulacro seaequalsel argumento en el código que se está probando, entonces Mockito coincidirá con el simulacro.Aquí hay un ejemplo.
luego, suponiendo que sepa cuál
someFieldserá el valor , puede burlarse de esta manera.Pros: esto es más explícito que los
anycomparadores. Como revisor de código, mantengo un ojo abiertoanyen el código que escriben los desarrolladores junior, ya que echa un vistazo a la lógica de su código para generar el objeto apropiado que se pasa.con: a veces el campo que se pasa al objeto es una ID aleatoria. Para este caso, no puede construir fácilmente el objeto de argumento esperado en su código simulado.
Otro enfoque posible es usar el
Answerobjeto de Mockito que se puede usar con elwhenmétodo.Answerle permite interceptar la llamada real e inspeccionar el argumento de entrada y devolver un objeto simulado. En el siguiente ejemplo, estoy usandoanypara capturar cualquier solicitud del método que se está burlando. Pero luego, en laAnswerlambda, puedo inspeccionar más el argumento de Bazo ... tal vez para verificar que se le haya pasado una identificación adecuada. Prefiero estoanypor sí solo para que al menos se realice una inspección sobre el argumento.Entonces, para resumir todo, me gusta confiar en
equals(donde el argumento esperado y el argumento real deberían ser iguales entre sí) y si igual no es posible (debido a que no puedo predecir el estado del argumento real), recurriré paraAnswerinspeccionar el argumento.fuente