¡Parece que la respuesta de Tomasz Nurkiewicz no cuenta toda la historia!
NB Mockito version: 1.10.19.
Soy mucho más un Mockito newb, por lo que no puedo explicar el siguiente comportamiento: si hay un experto que puede mejorar esta respuesta, por favor siéntase libre.
El método en cuestión aquí, getContentStringValue
, es NOfinal
y NOstatic
.
Esta línea hace llamar al método original getContentStringValue
:
doReturn("dummy").when(im).getContentStringValue(anyInt(), isA(ScoreDoc.class));
Esta línea no se llamada al método original getContentStringValue
:
doReturn("dummy").when(im).getContentStringValue(anyInt(), any(ScoreDoc.class));
Por razones que no puedo responder, el uso de isA()
hace que el comportamiento (?) "no llame al método" previsto de doReturn
falle.
Echemos un vistazo a las firmas de métodos implicados aquí: ambos son static
métodos de Matchers
. El Javadoc dice que ambos devuelven null
, lo cual es un poco difícil de entender. Presumiblemente, el objeto Class
pasado como parámetro se examina, pero el resultado nunca se calcula o se descarta. Dado que null
puede representar cualquier clase y que espera que no se llame al método falso, ¿no podrían las firmas de isA(...)
y any(...)
simplemente devolver null
en lugar de un parámetro genérico * <T>
?
De todos modos:
public static <T> T isA(java.lang.Class<T> clazz)
public static <T> T any(java.lang.Class<T> clazz)
documentación La API no da ninguna pista sobre esto. También parece decir que la necesidad de tal comportamiento de "no llamar método" es "muy raro". Personalmente utilizo esta técnica todo el tiempo: normalmente me parece que la burla implica unas pocas líneas que "configuran la escena" ... seguido de llamar a un método que luego "reproduce" la escena en el contexto simulado que has escenificado ... y mientras configuras el escenario y los accesorios, lo último que quieres es que los actores entren al escenario de la izquierda y comiencen a actuar con el corazón ...
Pero esto es mucho más allá de mi nivel salarial ... . Invito a las explicaciones de cualquier sumo sacerdote Mockito que pase ...
* es "parámetro genérico" el término correcto?
¿Qué pasa si utilizo este método y el original sigue SIENDO recibiendo llamadas? ¿Podría haber algún problema con los parámetros que paso? Aquí está toda la prueba: http://pastebin.com/ZieY790P El método 'send' se llama –
@EvgeniPetrov si su método original todavía se está llamando es probable porque su método original es definitivo. Mockito no se burla de los métodos finales y no puede advertirle sobre la burla de los métodos finales. – MarcG
¿Esto también es posible para doThrow()? – Gobliins