Tengo el siguiente método en el que deseo verificar el comportamiento.
public void methodToTest(Exception e, ActionErrors errors) {
...
errors.add("exception.message",
ActionMessageFactory.createErrorMessage(e.toString()));
errors.add("exception.detail",
ActionMessageFactory.createErrorMessage(e.getStackTrace()[0].toString()));
...
}
En mi clase @Test esperaba hacer algo como esto para verificar que errors.add()
se llama con "exception.message" y nuevamente con "exception.detail"
verify(errors).add(eq("exception.message"), any(ActionError.class));
verify(errors).add(eq("exception.detail"), any(ActionError.class));
sin embargo Mockito se queja de la siguiente manera
Argument(s) are different! Wanted:
actionErrors.add(
"exception.message",
<any>
);
Actual invocation has different arguments:
actionErrors.add(
"exception.detail",
org.apache.struts.action.ActionError@38063806
);
¿Cómo puedo decirle a Mockito que verifique ambos valores?
Mockito.reset()
Respuestas:
Leer más me ha llevado a intentar usar ArgumentCaptors y los siguientes trabajos, aunque mucho más detallados de lo que me gustaría.
fuente
methodToTest()
exactamente una vez, por lo tanto, esta respuesta verifica que las dos llamadas se realicen juntas. La capturaList<String> values
que se está afirmando solo contendrá los dos valores que se están probando y ningún otro. También podría agregarassertTrue(values.size == 2)
. Si esto es lo que quieres, reemplazaría las 3 declaraciones afirmarTrue con un solo Hamcrest ...assertThat(values, contains("exception.message", "exception.detail"));
methodToTest()
una vez. Es el argumento del método queActionErrors errors
se llama internamente dos veces.Si el orden de ambas
add()
llamadas es relevante, puede usarInOrder
:fuente
errors
argumento:InOrder inOrder = inOrder(errors);
(ver documentos )List
queSet
y afirmar que el conjunto de entradas es igual al conjunto dado por las capturas de argumento.Intente algo como esto:
fuente
probablemente tenga un problema en su código. Porque, de hecho, escribes este código:
Tenga en cuenta que la primera verificación ni siquiera está en orden con respecto a las invocaciones reales.
Además, le recomendaría que no se burle de los tipos que no le pertenecen, por ejemplo, el tipo struts.
[EDITAR @Brad]
Después de ejecutar el código de Brice (arriba) en mi IDE, puedo ver que he usado ActionError en lugar de ActionMessage, por eso mi verify () no coincide. El mensaje de error que publiqué inicialmente me engañó haciéndome pensar que era el primer argumento que no coincidía. Resulta que fue el segundo argumento.
Entonces la respuesta a mi pregunta es
fuente
InOrder
.Puede usar lo
Mockito.atLeastOnce()
que le permite a Mockito pasar la prueba incluso si ese mockObject se llamará muchas veces.fuente
1) Dile a Mokito la expectativa total de llamadas.
2) Dígale a Mokito cuántas veces se esperaba cada combinación de parámetros.
fuente
De manera similar a @ sendon1928 podemos usar:
para asegurarse de que se haya llamado al método el número exacto de veces (solución preferible en mi opinión). Luego, podemos llamar
Para asegurarse de que el simulacro no se use más en ningún contexto. Ejemplo completo:
fuente