在我们想要模拟的一个 Java 类中有一个 URL 对象,但它是最终类,所以我们不能。我们不想更上一层楼并模拟 InputStream,因为这仍然会给我们留下未经测试的代码(我们有严格的测试覆盖标准)。
我尝试了 jMockIt 的反射功能,但我们在 Mac 上工作,Java 代理处理程序存在我无法解决的问题。
那么有没有在junit测试中不涉及使用真实URL的解决方案?
最佳答案
就像 Rob 说的,如果你想要模拟从 URL 返回的连接,你可以扩展 URLStreamHandler
。例如,使用 mockito:
final URLConnection mockUrlCon = mock(URLConnection.class);
ByteArrayInputStream is = new ByteArrayInputStream(
"<myList></myList>".getBytes("UTF-8"));
doReturn(is).when(mockUrlCon).getInputStream();
//make getLastModified() return first 10, then 11
when(mockUrlCon.getLastModified()).thenReturn((Long)10L, (Long)11L);
URLStreamHandler stubUrlHandler = new URLStreamHandler() {
@Override
protected URLConnection openConnection(URL u) throws IOException {
return mockUrlCon;
}
};
URL url = new URL("foo", "bar", 99, "/foobar", stubUrlHandler);
doReturn(url).when(mockClassloader).getResource("pseudo-xml-path");
关于java - 在 Java 中模拟 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/565535/