在 Java 中模拟 URL

2022-09-01 16:25:11

我们在一个Java类中有一个URL对象,我们想要模拟它,但它是一个最终的类,所以我们不能。我们不想再往上一个级别,并嘲笑InputStream,因为这仍然会给我们留下未经测试的代码(我们有严格的测试覆盖率标准)。

我已经尝试了jMockIt的反射功能,但我们在Mac上工作,Java代理处理程序存在我无法解决的问题。

那么,是否有任何解决方案不涉及在 junit 测试中使用真实 URL?


答案 1

就像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");

答案 2

当我有一个不能轻易嘲笑的类,因为它是最终的(或在C#中密封),我通常的方法是在类周围编写一个包装器,并在我使用实际类的任何地方使用包装器。然后,我会根据需要模拟包装类。