Estoy tratando de probar un código heredado, usando Mockito.
Quiero tropezar con uno FooDao
que 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 Bazoo
objeto para el que calculé el método. (¡Maldición a ese new
operador!)
Me encantaría si pudiera tropezar el método de una manera que regrese myFoo
independientemente 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)Bazoo
oCazoo
los que son ambas subclases de, por ejemplo,Azoo
. porqueBazoo
necesitaba regresarfoo
, pero porqueCazoo
necesitaba regresarbar
. En esta situación, laMatchers.any()
solución propuesta no funciona, sin embargo,Matchers.isA()
funciona perfectamente.org.mockito.Matchers
ahora está en desuso - useorg.mockito.ArgumentMatchers
en su lugar, es decirimport static org.mockito.ArgumentMatchers.*
(ver documentos )when(myFoo.knowsWhatsUp()).thenReturn(myMoney);
Usar así:
Antes de que necesites importar
Mockito.Matchers
fuente
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 laBazoo
clase. Esto haría que su ejemplo de código funcione de la manera que desee.fuente
Otra opción es confiar en un buen
equals
método antiguo . Mientras el argumento en elwhen
simulacro seaequals
el 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
someField
será el valor , puede burlarse de esta manera.Pros: esto es más explícito que los
any
comparadores. Como revisor de código, mantengo un ojo abiertoany
en 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
Answer
objeto de Mockito que se puede usar con elwhen
método.Answer
le permite interceptar la llamada real e inspeccionar el argumento de entrada y devolver un objeto simulado. En el siguiente ejemplo, estoy usandoany
para capturar cualquier solicitud del método que se está burlando. Pero luego, en laAnswer
lambda, puedo inspeccionar más el argumento de Bazo ... tal vez para verificar que se le haya pasado una identificación adecuada. Prefiero estoany
por 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é paraAnswer
inspeccionar el argumento.fuente