2010-11-18 10 views
11

Come posso eseguire lo stub di un metodo tale che quando viene fornito un valore che non mi aspetto, restituisce un valore predefinito?Default di stub in Mockito

Ad esempio:

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: Come sopra, ma genera un'eccezione:

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")); 

Negli esempi precedenti, l'ultimo stub ha la precedenza in modo che la mappa sarà sempre tornare il default.

+0

e la domanda è? – Bozho

risposta

21

La soluzione migliore che ho trovato è quello di invertire l'ordine del stub:

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"); 

Quando il valore predefinito è quello di generare un'eccezione si può semplicemente utilizzare doThrow e 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

Grazie per la risposta completa che include 'doReturn()'. ('doThrow()' non è necessario in questo caso tranne che per la coerenza.) – 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() 
    } 
}); 

E 'una specie di un modo indiretto per fare questo. Ma dovrebbe funzionare.

2

È possibile utilizzare:

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");