16

予期しない値が与えられたときにデフォルト値を返すようにメソッドをスタブするにはどうすればよいですか?

例えば:

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

パート2:上記と同じですが、例外をスローします:

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

上記の例では、最後のスタブが優先されるため、マップは常にデフォルトを返します。

4

3 に答える 3

29

私が見つけた最善の解決策は、スタブの順序を逆にすることです。

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

デフォルトで例外をスローする場合は、doThrowとdoReturnを使用できます。

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

https://static.javadoc.io/org.mockito/mockito-core/2.18.3/org/mockito/Mockito.html#12

于 2010-11-20T10:54:32.320 に答える
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()
    }
});

これを行うには、一種の回り道です。しかし、それは機能するはずです。

于 2010-11-18T15:27:38.120 に答える
2

次を使用できます。

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");
于 2015-06-03T00:55:20.787 に答える