【发布时间】:2021-04-06 15:36:04
【问题描述】:
我正在尝试模拟一个使用 URLConnection 类打开连接然后获取流输入的方法。我想有效地模拟 URLConnection 类,但不能这样做。 以下是我的代码:
实际方法
@GetMapping(value = "/search/autocomplete")
public String autocomplete() {
try {
URL url = new URL("http://" + serverHost + ":" + serverPort + "/autocomplete");
URLConnection uc = url.openConnection();
String sb = toStringFromStream(uc.getInputStream());
return sb;
} catch (Exception e) {
log.warn(e.getMessage());
}
return "";
}
测试方法:
@Test
public void autocomplete() throws Exception {
URL url = PowerMockito.mock(URL.class);
PowerMockito.whenNew(URL.class).withArguments("http://" + serverHost + ":" + serverPort +
"/autocomplete").thenReturn(url);
ReflectionTestUtils.setField(searchController,"serverHost","localhost");
ReflectionTestUtils.setField(searchController,"serverPort",3000);
InputStream anyInputStream = new ByteArrayInputStream("molly\nted".getBytes());
URLConnection uc = PowerMockito.mock(URLConnection.class);
PowerMockito.doReturn(uc).when(url).openConnection();
Mockito.doReturn(anyInputStream).when(uc).getInputStream();
PowerMockito.mock(Streamutils.class);
PowerMockito.when(Streamutils.toStringFromStream(anyInputStream)).thenReturn("molly");
String string = searchController.autocomplete();
assertEquals("",string);
}
当我运行这个测试并通过它调用实际方法时,URL url 占用了 http://localhost:3000/autocomplete 而不是 Mocked URL 类。然后uc 也不会占用模拟值并打开连接,即使我在这里也提供了模拟:URLConnection uc = PowerMockito.mock(URLConnection.class); PowerMockito.doReturn(uc).when(url).openConnection();。然后String sb = toStringFromStream(uc.getInputStream()); 这一行从实际类执行,我不知道为什么它总是进入异常块。请任何人提出解决此问题的建议!
【问题讨论】:
标签: java unit-testing mockito urlconnection httpconnection