2011-06-17 23 views
17

Me encontré con un problema y no puedo encontrar una solución elegante.Cómo simular/probar el método que devuelve vacío, posiblemente en Mockito

Así que el problema es con un simulacro de controlador web Selenium, y no sé cómo debería probar/simular métodos vacíos.

public void clickAndWait(String locator) { 
    if(isElementPresent(locator) == false) throw some exception; 
    selenium.clickAndWait(); //a problematic delegating call to selenium 
} 

Así que lo que estoy preguntando es, cómo probar apropiadamente un procedimiento de este tipo, una prueba sería para ser lanzado excepción, pero ¿cómo hacer correctamente la prueba de que el método vacío que delegar en?

+5

Solo por curiosidad, ¿por qué escribes pruebas unitarias para una prueba de integración? –

+0

Posible duplicado de [Cómo hacer falsa a los métodos de vacío con mockito] (https: // stackoverflow.com/questions/2276271/how-to-make-mock-to-void-methods-with-mockito) – centic

Respuesta

31

El siguiente ejemplo de código de este Mockito documentation ilustra cómo se burlan de un método vacío:

doThrow(new RuntimeException()).when(mockedList).clear(); 

// following throws RuntimeException: 
mockedList.clear(); 
+0

El enlace Mockito Documentation no está disponible ahora :( – DeepInJava

+0

@DeepInJava - gracias por señalar esto Enlace actualizado ... – hoipolloi

21
doAnswer(new Answer<Void>() { 
     @Override 
     public Void answer(InvocationOnMock invocation) throws Throwable { 

      return null; 
     } 
    }).when(mock).method((SomeClass) anyObject()); 
+1

+1 Respuesta útil que muestra cómo usar doThrow/doAnswer/etc cuando el método toma parámetros, es decir, el casting con 'anyObject()'. –

+0

Hola Marcin, traté de dar lo mismo y de obtener el error mencionado en http://stackoverflow.com/ preguntas/27142314/powermock-mocking-void-method-throws-error ¿Puedes echarle un vistazo? – sriram

1

También puede utilizar:

  • El método Mockito.verify (maqueta/espía) para verificar cuántas veces se ha llamado al método.
  • O use el argument captor para ver/verificar algunos parámetros pasados ​​al método void.
0

Puede trow una excepción en su llamada a un método, aquí es un pequeño ejemplo de cómo hacerlo:

doThrow(new RuntimeException()).when(mockedList).clear(); 

Posteriormente, se llama mockedList.clear(); método burlado lanzará una excepción.

O puede contar cuántas veces se llama su método, aquí es un pequeño ejemplo de cómo hacerlo:

verify(mockedList, times(1)).clear(); 
10

Las respuestas anteriores han hecho hincapié en hacer algo (una excepción posiblemente) en cada llamada. De esta manera cuando haces algo como:

doThrow(new RuntimeException()).when(mockedList).clear(); 

y luego llamar al servicio de stubbed (o lógica) como:

mockedList.clear(); 

se generará una excepción. ¿Qué sucede si desea probar el funcionamiento correcto del método y escribir un caso de prueba positivo? Escarneciendo, un vacío método de regresar para tal caso podría hacerse mediante:

doNothing().when(mockedList).clear(); 

lo que significa que ya se apagó el método clear() para mockedList simulacro, puede estar seguro de que este método no va a afectar a la lógica de la unidad y aún puede verificar el resto del flujo sin generar una excepción.

+0

Hola Sourabh, probé la misma solución y obtuve la excepción mencionada en http://stackoverflow.com/questions/ 27142314/powermock-mocking-void-method-throws-error ¿Puedes echar un vistazo a eso? – sriram

0

En Java 8 esto se puede hacer un poco más limpio

doAnswer((i) -> { 
    // Do stuff with i.getArguments() here 
    return null; 
}).when(*mock*).*method*(*methodArguments*); 

El return null; es importante y sin ella la compilación fallará con algunos errores bastante oscuros, ya que no será capaz de encontrar un reemplazo adecuado para doAnswer.

Cuestiones relacionadas