我有:
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");
这永远不会被触发。
有男孩明白为什么吗?
我相信
问题出在方法重载上。 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");
感谢您的回答,这真的很有帮助。
以下是完整的源代码,认为对其他人有帮助。
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);
}