2012-08-02 17 views
58

Quiero usar Mockito para probar el código (simplificado) a continuación. No sé cómo decirle a Mockito que falle la primera vez, y luego triunfar la segunda vez.Simular la primera llamada falla, la segunda llamada tiene éxito

for(int i = 1; i < 3; i++) { 
    String ret = myMock.doTheCall(); 

    if("Success".equals(ret)) { 
    log.write("success"); 
    } else if (i < 3) { 
    log.write("failed, but I'll try again. attempt: " + i); 
    } else { 
    throw new FailedThreeTimesException(); 
    } 
} 

puedo configurar la prueba de éxito con:

Mockito.when(myMock).doTheCall().thenReturn("Success"); 

Y la prueba de fallos con:

Mockito.when(myMock).doTheCall().thenReturn("you failed"); 

Pero, ¿cómo puedo probar que si falla una vez (o dos veces) y luego tiene éxito, está bien?

+0

¿Puede alguien explicar cómo lograr lo mismo usando Jmockito – Bharat

Respuesta

130

De the docs:

veces tenemos que stub con diferente valor de retorno/excepción para la misma llamada al método. El caso de uso típico podría ser iteradores burlones. La versión original de Mockito no tenía esta función para promover la burla simple. Por ejemplo, en lugar de iteradores, uno podría usar Iterable o simplemente colecciones. Esos ofrecen formas naturales de stubbing (por ejemplo, utilizando colecciones reales). En escenarios poco comunes stubbing llamadas consecutivas podría ser útil, sin embargo:

when(mock.someMethod("some arg")) 
    .thenThrow(new RuntimeException()) 
    .thenReturn("foo"); 

//First call: throws runtime exception: 
mock.someMethod("some arg"); 

//Second call: prints "foo" 
System.out.println(mock.someMethod("some arg")); 

Así, en su caso, que querría:

when(myMock.doTheCall()) 
    .thenReturn("You failed") 
    .thenReturn("Success"); 
+0

Hey, eso es impresionante, gracias Jon. – vikingsteve

+9

Esto me apuntó en la dirección correcta (gracias) para mi escenario que trataba con métodos nulos - en ese caso necesita usar el estilo alternativo ... 'doThrow (new RuntimeException()). DoNothing(). When (myMock) .doTheCall(); ' – haggisandchips

18

El camino más corto para escribir lo que desea es

when(myMock.doTheCall()).thenReturn("Success", "you failed"); 

Cuando proporciona argumentos mutiples a thenReturn de esta manera, cada argumento se utilizará a lo sumo una vez, excepto el último argumento, w Que se usa tantas veces como sea necesario. Por ejemplo, en este caso, si realiza la llamada 4 veces, obtendrá "Éxito", "falló", "falló", "falló".

6

Dado que el comentario que se refiere a esto es difícil de leer. Añadiré una respuesta formateada.

Si está intentando hacer esto con una función anulada. Donde podría querer una excepción que ningún comportamiento. De allí tendría que hacer algo como esto:

Mockito.doThrow(new Exception("MESSAGE")) 
      .doNothing() 
      .when(mockService).method(eq()); 
0

para añadir a this y this respuesta, también se puede utilizar un bucle de cadena de las llamadas burlado. Esto es útil si necesita burlarse de lo mismo varias veces, o se burla de algún patrón.

ejemplo (aunque sea inverosímil):

import org.mockito.stubbing.Stubber; 

Stubber stubber = doThrow(new Exception("Exception!")); 
for (int i=0; i<10; i++) { 
    if (i%2 == 0) { 
     stubber.doNothing(); 
    } else { 
     stubber.doThrow(new Exception("Exception")); 
    } 
} 
stubber.when(myMockObject).someMethod(anyString()); 
Cuestiones relacionadas