public abstract class A {
public String method1( String urlString ) {
HTTP HttpURLConnection con = getConnection(url);
.... I use con.getInpurStream() to get the data and return it...
}
public HttpURLConnection getConnection(URL url) {
URL url = new URL(urlString);
return (HttpURLConnection) url.openConnection();
}
}
public class B extends A {
public String method2(String urlString) {
return method1(urlString);
}
}
我想用JUNIT和Mockito为B类方法2写单元测试。
我累了这样的东西。
public class testB {
String urlString = "someValid.url";
String dummyRes = "dummy Response";
InputStream res = new ByteArrayInputStream(dummyRes.getBytes());
B mockB = Mockito.mock(B.class);
HttpURLConnection connection = Mockito.mock(HttpURLConnection.class);
Mockito.when(connection.getInputStream()).thenReturn(res);
Mockito.when(mockB.getConnection(urlString)).thenRetrun(connection);
assertEquals("dummy Response", mockB.method2("someValid.url");
}
我一直从那个url中获取实时数据,而不是dummyRes。
请帮助我
编辑1:
删除了静态方法。而且仍然无法模拟getConnection()方法来返回被模拟的连接。
编辑2:将URL对象移到getConnection方法中。
将URL对象移至getConnection方法,以避免制作一个新的URL,这样我就可以模拟它,并为此在测试中做了修改。依然可以接收到实时值。
似乎应该有这样的东西
Mockito.when(mockB.getConnection(Mockito.eq("someValid.url" ))).thenReturn(connection);
静态方法不能直接被嘲讽,要嘲讽静态方法,你需要在Mockito之上使用PowerMock。
还有一个选择是使用Jmockit框架。这可以代替使用两个框架(Mockito和PowerMock)。
这里是参考资料,为什么静态方法的嘲讽不能与Mockito一起工作----------。
[更新]:关于连接的模拟问题。
而不是
Mockito.when(mockB.getConnection(tempURL)).thenRetrun(connection);
试用
Mockito.when(mockB.getConnection(any())).thenRetrun(connection);
如果你不想通过 任何,替代方法可以是嘲讽URL类和方法。打开连接 也是。