我们在我们想要模拟的 Java 类之一中有一个 URL 对象,但它是最终类,所以我们不能。我们不想更上一层楼,并模拟 InputStream,因为这仍然会给我们留下未经测试的代码(我们有严格的测试覆盖率标准)。
我已经尝试过 jMockIt 的反射能力,但我们在 Mac 上工作,Java 代理处理程序存在我无法解决的问题。
那么有没有不涉及在junit测试中使用真实URL的解决方案呢?
原文由 bowsie 发布,翻译遵循 CC BY-SA 4.0 许可协议
就像 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");
原文由 Artefacto 发布,翻译遵循 CC BY-SA 3.0 许可协议
8 回答6.5k 阅读
4 回答703 阅读✓ 已解决
2 回答3.4k 阅读
3 回答1.9k 阅读✓ 已解决
1 回答2.2k 阅读✓ 已解决
1 回答2.1k 阅读✓ 已解决
1 回答972 阅读✓ 已解决
当我有一个类因为它是最终类(或在 C# 中密封)而不能轻易模拟时,我通常的做法是围绕该类编写一个包装器,并在我要使用实际类的任何地方使用该包装器。然后我会根据需要模拟包装类。