在 Java 中模拟 URL
我们在一个Java类中有一个URL对象,我们想要模拟它,但它是一个最终的类,所以我们不能。我们不想再往上一个级别,并嘲笑InputStream,因为这仍然会给我们留下未经测试的代码(我们有严格的测试覆盖率标准)。
我已经尝试了jMockIt的反射功能,但我们在Mac上工作,Java代理处理程序存在我无法解决的问题。
那么,是否有任何解决方案不涉及在 junit 测试中使用真实 URL?
我们在一个Java类中有一个URL对象,我们想要模拟它,但它是一个最终的类,所以我们不能。我们不想再往上一个级别,并嘲笑InputStream,因为这仍然会给我们留下未经测试的代码(我们有严格的测试覆盖率标准)。
我已经尝试了jMockIt的反射功能,但我们在Mac上工作,Java代理处理程序存在我无法解决的问题。
那么,是否有任何解决方案不涉及在 junit 测试中使用真实 URL?
就像Rob说的,如果你想要的是模拟从URL返回的连接,你可以扩展 。例如,使用 mockito:URLStreamHandler
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");
当我有一个不能轻易嘲笑的类,因为它是最终的(或在C#中密封),我通常的方法是在类周围编写一个包装器,并在我使用实际类的任何地方使用包装器。然后,我会根据需要模拟包装类。