2012-04-19 86 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

我相信问题是方法重载。 getForObject有两个重载版本服用三个参数:

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

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

,同时要嘲笑的第一个你实际上是嘲讽第二个。为了帮助静态方法解析铸就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 2012-04-20 05:37:11

+0

请注意,mamruoc的片段仅适用于Mockito 1.9.0及更高版本。 – 2012-04-20 07:02:08

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