2010-11-18 18 views
11

¿Cómo puedo resguardar un método de tal manera que cuando se le da un valor que no estoy esperando, devuelve un valor predeterminado?Anulación de valores predeterminados en Mockito

Por ejemplo:

Map<String, String> map = mock(Map.class); 
when(map.get("abcd")).thenReturn("defg"); 
when(map.get("defg")).thenReturn("ghij"); 
when(map.get(anyString())).thenReturn("I don't know that string"); 

Parte 2: Igual que el anterior pero se produce una excepción:

Map<String, String> map = mock(Map.class); 
when(map.get("abcd")).thenReturn("defg"); 
when(map.get("defg")).thenReturn("ghij"); 
when(map.get(anyString())).thenThrow(new IllegalArgumentException("I don't know that string")); 

En los ejemplos anteriores, el último trozo tiene prioridad por lo que el mapa siempre devolverá el valor predeterminado.

+0

y la pregunta es? – Bozho

Respuesta

21

La mejor solución que he encontrado es para invertir el orden de los talones:

Map<String, String> map = mock(Map.class); 
when(map.get(anyString())).thenReturn("I don't know that string"); 
when(map.get("abcd")).thenReturn("defg"); 
when(map.get("defg")).thenReturn("ghij"); 

Cuando el defecto es una excepción que sólo puede utilizar doThrow y doReturn

doThrow(new RuntimeException()).when(map).get(anyString()); 
doReturn("defg").when(map).get("abcd"); 
doReturn("ghij").when(map).get("defg"); 

http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html#doReturn%28java.lang.Object%29

+1

Gracias por la respuesta exhaustiva que incluye 'doReturn()'. ('doThrow()' no es necesario en este caso excepto por la coherencia). – David

2
when(map.get(anyString())).thenAnswer(new Answer<String>() { 
    public String answer(Invocation invocation) { 
     String arg = (String) invocation.getArguments()[0]; 
     if (args.equals("abcd") 
      return "defg"; 
     // etc. 
     else 
      return "default"; 
      // or throw new Exception() 
    } 
}); 

Es una manera indirecta de hacer esto. Pero debería funcionar

2

Puede usar:

Map<String, String> map = mock(Map.class, new Returns("I don't know that string")); 
when(map.get("abcd")).thenReturn("defg"); 
when(map.get("defg")).thenReturn("ghij"); 
Cuestiones relacionadas