3

我有:

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

这永远不会被触发。

有男孩明白为什么吗?

4

2 回答 2

7

我相信问题在于方法重载。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");
于 2012-04-19T21:45:17.717 回答
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);
}
于 2015-07-23T19:06:50.867 回答