2012-04-19 9 views
1

あざける:私はRestOperationsを模擬しようとする私のテストではMockito - 私が持っているRestOperations

Map<String, String> vars = new HashMap<String, String>(); 
String r = restOperations.getForObject(url, String.class, vars); 

を:

@Mock 
RestOperations restOperations; 

when(restOperations.getForObject(Matchers.anyString(), Matchers.eq(String.class), Matchers.notNull())).thenReturn("ok"); 

このトリガーされることはありません飽きません。

なぜか分かりますか?

答えて

3

私はこの問題がメソッドオーバーロードにあると信じています。 getForObjectは3つの引数を取る2つのオーバーロードされたバージョンがあります:

<T> T getForObject(String url, Class<T> responseType, Map<String, ?> uriVariables); 

<T> T getForObject(String url, Class<T> responseType, Object... uriVariables); 

あなたが最初のものをモックとしたいしながら、あなたが実際に第二1をからかっています。静的メソッド解決が明示的にnotNull()試合をキャストしやすくするために:

when(restOperations.getForObject(
    Matchers.anyString(), Matchers.eq(String.class), (Map)Matchers.notNull()) 
).thenReturn("ok"); 

あるいはさらに良いが、anyMap()を使用します。あなたの答えのための

when(restOperations.getForObject(
    Matchers.anyString(), Matchers.eq(String.class), Matchers.anyMap()) 
).thenReturn("ok"); 
+0

さらに良い: '場合(restOperations.getForObject( Matchers.anyString()、Matchers.eq(String.class)、Matchers.anyMapOf(String.class、String.class)) ).thenReturn ( "ok"); 'ありがとう! – mamruoc

+0

mamruocのスニペットは、Mockito 1.9.0以降でのみ動作することに注意してください。 –

1

おかげで、それは本当に便利でした。

以下は、完全なソースコードですが、他の人にとって参考になると思います。

public class HandlerTest { 

    private Handler handler; 

    @Before 
    public void setUp() { 
     handler = new HandlerImpl(); 
    } 

    @Test 
    public void testMethodtoTest() { 
     String param1 = "123456"; 
     String param2 = "3736272"; 
     String param3 = "838912"; 

     RestTemplate mock = Mockito.mock(RestTemplate.class); 
     Mockito.when(mock.getForObject(Matchers.anyString(), Matchers.eq(String.class), Matchers.anyMapOf(String.class, String.class))).thenReturn("ok"); 
     handler.setRestTemplate(mock); 

     String actualResponse = handler.MethodtoTest(param1, param2, param3); 

     Assert.assertNotNull(actualResponse); 
     Assert.assertEquals("ok",actualResponse); 
}