如何使用Mockito模拟URLConnection类



我正在尝试模拟一个方法,该方法使用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("mollynted".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类。那么CCD_ 3也不接受mock值并打开连接,即使我在这里也为它提供了mock:CCD_。然后String sb = toStringFromStream(uc.getInputStream());这一行从实际的类执行,我不知道为什么它总是转到异常块。有人建议解决这个问题吗!

不是您要求的答案,而是一些避免问题的建议。

我建议不要将低级别I/O操作作为单元测试的一部分。将连接逻辑拆分为一个依赖项,并将单元测试集中在您自己的业务逻辑上。如果您为这样的低级别内容编写单元测试,那么您主要是在测试框架代码,而不是自己的代码。

如果您仍然想确认I/O是否工作,请为实际连接到URL的I/O编写一个集成测试。

编辑:有关集成测试的有价值的方法,请参阅https://docs.pact.io/

相关内容

  • 没有找到相关文章

最新更新