Estoy aprendiendo Mockito por el momento y una de las cosas que estoy haciendo para consolidar mi aprendizaje es convertir una vieja prueba JUnit de usar una clase simulada enrollada a mano a una que usa simulacros de Mockito en su lugar. Sin embargo, me encontré con una situación que no estoy seguro de cómo manejarla.¿Es posible consultar contra argumentos pasados a un objeto simulado de Mockito?
Específicamente, mi unidad bajo prueba construye un String
que se pasa al objeto burlado como parámetro en una llamada de método sobre él. Me gustaría probar que el String
está construido correctamente. El desafío es que parte de String
es una clave hash que se genera internamente y cambia en cada invocación. Una solución que funcionaría sería mantener la generación de hash bajo mi control e inyectar un generador ficticio para la ejecución de la prueba. Sin embargo, esto es un poco de trabajo.
Mi antigua clase de simulacro robada almacenaría los argumentos que se le pasaron y que podría consultar en mi prueba. Esto me permitió a la pregunta del comienzo y al final del String
a través de lo siguiente:
assertTrue(mockFtpClient.getFilePathAndName().startsWith("/data/inbound/XJSLGG."));
assertTrue(mockFtpClient.getFilePathAndName().endsWith(".pdf"));
Ésta era una prueba suficiente sufficent para mi gusto. Entonces mi pregunta es, ¿es posible usar Mockito para consultar o obtener un control de los argumentos pasados a un método para que pueda realizar algo similar a lo anterior?
ACTUALIZACIÓN 24/06/2011: En este punto, he exceptuado la respuesta de Gnon. Sin embargo, desde entonces descubrí algo que funciona mejor para mí. A saber, ArgumentCaptor
. Así es como funciona:
ArgumentCaptor<String> fileNameArgument = ArgumentCaptor.forClass(String.class);
verify(mockFtpClient).putFileOnServer(fileNameArgument.capture());
assertTrue(fileNameArgument.getValue().startsWith(START_FILE_NAME) &&
fileNameArgument.getValue().endsWith(END_FILE_NAME));
el Javadoc para el estado Mockito que ArgumentCaptor
es generalmente una mejor opción cuando se tiene un requisito argumento de comparación específica de una sola vez, como lo hago aquí.
Gracias por la actualización, no sabía acerca de ArgumentCaptor. –
¡ArgumentCaptor va a cambiar mi vida (de codificación)! –