2010-11-18 12 views
11

Wie kann ich eine Methode so stub, dass, wenn ein Wert, den ich nicht erwartet, gibt es einen Standardwert zurück?Stubbing defaults in Mockito

Zum Beispiel:

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

Teil 2: Wie oben, jedoch löst eine Ausnahme:

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

In den obigen Beispielen die letzten Stummel haben Vorrang, so dass die Karte wird immer die Standardeinstellung zurück.

+0

und die Frage ist? – Bozho

Antwort

21

Die beste Lösung, die ich gefunden habe, ist die Reihenfolge des Stubs zu umkehren:

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

Wenn der Standard eine Ausnahme zu werfen ist einfach doThrow und 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

verwenden kannst
+1

Danke für die gründliche Antwort einschließlich 'doReturn()'. ('doThrow()' ist in diesem Fall außer für die Konsistenz unnötig.) – 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 ist eine Art Umweg, dies zu tun. Aber es sollte funktionieren.

2

Sie können verwenden:

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