我们的一个Java类中有一个要模拟的URL对象,但它是最后一个类,所以我们无法模拟它。我们不想更上一层楼,嘲笑InputStream,因为这仍然会给我们留下未测试的代码(我们有严格的测试覆盖率标准)。
我尝试过jMockIt的反射功能,但我们在Mac上工作,Java代理处理程序存在一些我无法解决的问题。
那么,有没有什么解决方案不涉及在junit测试中使用真正的URL呢?
发布于 2009-02-19 14:30:22
当我有一个不容易模拟的类,因为它是最终的(或在C#中密封的),我通常的方法是在类周围编写一个包装器,并在任何需要使用实际类的地方使用包装器。然后,我会根据需要模拟包装器类。
发布于 2011-05-31 23:24:22
就像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");
发布于 2013-01-18 05:11:39
我采用了以下方法:
public static URL getMockUrl(final String filename) throws IOException {
final File file = new File("testdata/" + filename);
assertTrue("Mock HTML File " + filename + " not found", file.exists());
final URLConnection mockConnection = Mockito.mock(URLConnection.class);
given(mockConnection.getInputStream()).willReturn(
new FileInputStream(file));
final URLStreamHandler handler = new URLStreamHandler() {
@Override
protected URLConnection openConnection(final URL arg0)
throws IOException {
return mockConnection;
}
};
final URL url = new URL("http://foo.bar", "foo.bar", 80, "", handler);
return url;
}
这给了我一个真正的URL对象,其中包含我的模拟数据。
https://stackoverflow.com/questions/565535
复制相似问题