¿Cómo burlarse de los métodos con tipo de retorno nulo?
Implementé un patrón de observación, pero no puedo burlarme de él porque no sé cómo.
Y traté de encontrar un ejemplo en Internet pero no tuve éxito.
Mi clase se ve así:
public class World {
List<Listener> listeners;
void addListener(Listener item) {
listeners.add(item);
}
void doAction(Action goal,Object obj) {
setState("i received");
goal.doAction(obj);
setState("i finished");
}
private string state;
//setter getter state
}
public class WorldTest implements Listener {
@Test public void word{
World w= mock(World.class);
w.addListener(this);
...
...
}
}
interface Listener {
void doAction();
}
El sistema no se activa con simulacro.
Quiero mostrar el estado del sistema mencionado anteriormente. Y hacer afirmaciones según ellos.
Respuestas:
Echa un vistazo a los documentos de la API de Mockito . A medida que el documento vinculado menciona (punto # 12), puede utilizar cualquiera de los
doThrow()
,doAnswer()
,doNothing()
,doReturn()
familia de métodos de marco Mockito para burlarse de los métodos vacíos.Por ejemplo,
o si quieres combinarlo con un comportamiento de seguimiento,
Suponiendo que está buscando burlarse del setter
setState(String s)
en la clase World a continuación, el código usa eldoAnswer
método para burlarse delsetState
.fuente
setRate()
esfinal
, y por lo tanto no se puede burlar. En su lugar, intente probarcreate()
una instancia que haga lo que necesita. No debería haber necesidad de burlarseRateLimiter
.Creo que he encontrado una respuesta más simple a esa pregunta, para llamar al método real para un solo método (incluso si tiene un retorno nulo), puede hacer esto:
O bien, puede llamar al método real para todos los métodos de esa clase, haciendo esto:
fuente
Además de lo que dijo @sateesh, cuando solo quieres burlarte de un método nulo para evitar que la prueba lo llame, puedes usar un
Spy
método de esta manera:Cuando desee ejecutar su prueba, asegúrese de llamar al método en prueba en el
spy
objeto y no en elworld
objeto. Por ejemplo:fuente
La solución del llamado problema es usar un
spy
Mockito.spy (...) en lugar de unmock
Mockito.mock (..) .Spy nos permite burlas parciales. Mockito es bueno en este asunto. Debido a que tiene una clase que no está completa, de esta manera se burla de algún lugar requerido en esta clase.
fuente
En primer lugar: siempre debe importar mockito static, de esta manera el código será mucho más legible (e intuitivo):
Para burlarse parcial y aún mantener la funcionalidad original en el resto, mockito ofrece "Spy".
Puede usarlo de la siguiente manera:
Para eliminar la ejecución de un método, puede usar algo como esto:
para dar un comportamiento personalizado a un método, use "when" con un "thenReturn":
Para obtener más ejemplos, encuentre las excelentes muestras de mockito en el documento.
fuente
Cómo burlarse de los métodos nulos con mockito: hay dos opciones:
doAnswer
- Si queremos que nuestro método vacío simulado haga algo (burlarse del comportamiento a pesar de estar vacío).doThrow
- Luego estáMockito.doThrow()
si quieres lanzar una excepción del método de anulación simulada.El siguiente es un ejemplo de cómo usarlo (no es un caso de uso ideal pero solo quería ilustrar el uso básico).
Puede encontrar más detalles sobre cómo burlarse y probar métodos vacíos con Mockito en mi publicación Cómo burlarse de Mockito (Una guía completa con ejemplos)
fuente
Agregar otra respuesta al grupo (sin juego de palabras) ...
Debe llamar al método doAnswer si no puede \ no quiere usar espías. Sin embargo, no necesariamente necesita lanzar su propia respuesta . Hay varias implementaciones predeterminadas. En particular, CallsRealMethods .
En la práctica, se parece a esto:
O:
fuente
En Java 8, esto se puede hacer un poco más limpio, suponiendo que tenga una importación estática para
org.mockito.Mockito.doAnswer
:Esto
return null;
es importante y sin él la compilación fallará con algunos errores bastante oscuros, ya que no podrá encontrar una anulación adecuada paradoAnswer
.Por ejemplo, un
ExecutorService
que solo ejecuta inmediatamente cualquierRunnable
pase que seexecute()
pueda implementar usando:fuente
Creo que sus problemas se deben a su estructura de prueba. Me resulta difícil mezclar burlas con el método tradicional de implementación de interfaces en la clase de prueba (como lo ha hecho aquí).
Si implementa el oyente como un simulacro, puede verificar la interacción.
Esto debería satisfacerte de que el 'Mundo' está haciendo lo correcto.
fuente
Usando Mockito.doThrow como en:
puedes probar este buen ejemplo:
Fuente: http://apisonar.com/java-examples/org.mockito.Mockito.doThrow.html#Example-19
fuente