2012-04-19 4 views
1

내가 가진 : 내 테스트에서Mockito - 조롱 RestOperations은

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

나는 RestOperations을 조롱하려고 :

@Mock 
RestOperations restOperations; 

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

이 트리거되지 얻을 않았다.

왜 그런지 알겠습니까?

답변

3

이 문제는 메서드 오버로딩과 관련이 있다고 생각합니다. 첫 번째 하나를 조롱 할 때 당신은 실제로 두 번째를 조롱하는

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

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

: getForObject는 세 개의 인자를 가지고 두 개의 오버로드 된 버전이 있습니다. 정적 메소드 해상도가 명시 적으로 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); 
}