Actualmente estoy en el proceso de usar Mockito para simular mis objetos de capa de servicio en una aplicación Spring MVC en la que quiero probar mis métodos de controlador. Sin embargo, como he estado leyendo sobre los detalles de Mockito, he encontrado que los métodos doReturn(...).when(...)
son equivalentes a when(...).thenReturn(...)
. Entonces, mi pregunta es ¿cuál es el punto de tener dos métodos que hacen lo mismo o cuál es la sutil diferencia entre doReturn(...).when(...)
y when(...).thenReturn(...)
?
Cualquier ayuda sería apreciada.
java
unit-testing
mockito
Pantera negra
fuente
fuente
doReturn()
es útil.Respuestas:
Las dos sintaxis para el apilamiento son aproximadamente equivalentes. Sin embargo, siempre se puede usar
doReturn/when
para tropezar; pero hay casos en los que no puedes usarwhen/thenReturn
. Stubbing métodos vacíos es uno de esos. Otros incluyen el uso con espías Mockito y tropezar con el mismo método más de una vez.Una cosa que
when/thenReturn
le da, quedoReturn/when
no lo hace, es la verificación de tipo del valor que está devolviendo, en el momento de la compilación. Sin embargo, creo que esto casi no tiene valor: si tiene el tipo incorrecto, lo descubrirá tan pronto como ejecute su prueba.Recomiendo encarecidamente solo usar
doReturn/when
. No tiene sentido aprender dos sintaxis cuando una lo hará.Es posible que desee consultar mi respuesta en Forming Mockito "gramáticas" , una respuesta más detallada a una pregunta muy relacionada.
fuente
doReturn/when
y paso los siguientes minutos averiguando qué salió mal. La comprobación de tipo de compilación se vuelve extremadamente útil conwhen/thenReturn
.when/thenReturn
lugar dedoReturn/when
.doReturn/when
es una compensación. El equipo no recomienda de una forma u otra, pero tenga en cuenta que elwhen/then
enfoque es más intuitivo, más legible y ofrece verificación de tiempo de compilación, es el enfoque que hizo que Mockito sea popular y fácil de usar, no olvide que cuando el código base es compartido por varias habilidades en su equipo; Sin embargo, tiene inconvenientes con respecto a los espías y los métodos nulos.doReturn()
tiene la gran desventaja de convertirse en codificación de llamadas de método al estilo YODA. Lo que luego viene escrito primero es decir. La mayoría de la gente lee de izquierda a derecha; así que ahora debes recordar constantemente invertir la lógica de retorno cuando en tu cabeza.Ambos enfoques se comportan de manera diferente si usa un objeto espiado (anotado con
@Spy
) en lugar de un simulacro (anotado con@Mock
):when(...) thenReturn(...)
realiza una llamada de método real justo antes de que se devuelva el valor especificado. Entonces, si el método llamado arroja una Excepción, debe lidiar con ella / burlarse, etc. Por supuesto, aún obtiene su resultado (lo que definethenReturn(...)
)doReturn(...) when(...)
no llama al método en absoluto .Ejemplo:
Prueba:
fuente
doReturn()
, parece un abuso de la biblioteca. El punto de espiar en lugar de pura burla es aprovechar las llamadas reales. También advierten contra el uso de espías como este: github.com/mockito/mockito/wiki/Using-Spies-(and-Fakes) (y recomiendan extender la clase y anular el método)Mockito javadoc parece decir por qué usar en
doReturn()
lugar dewhen()
Use doReturn () en esas raras ocasiones en las que no puedes usar Mockito.when (Object).fuente
Continuando con esta respuesta , existe otra diferencia de que si desea que su método devuelva diferentes valores, por ejemplo, cuando se llama por primera vez, se llama por segunda vez, etc., puede pasar valores, por ejemplo ...
Por lo tanto, devolverá falso cuando se llame al método en el mismo caso de prueba y luego devolverá falso nuevamente y, por último, verdadero.
fuente
La última alternativa se usa para métodos en simulacros que regresan
void
.Eche un vistazo, por ejemplo, aquí: Cómo hacer métodos simulados para anular con mockito
fuente