我想使用PowerMockito来模拟我测试的代码中的java.net.URL类的创建。基本上,我想阻止发生真正的HTTP请求,而不是1)在请求发生时检查数据,2)在模拟的响应中提供自己的测试数据。这就是我想:无法使用PowerMockito/Mockito模拟URL类
@RunWith(PowerMockRunner.class)
@PrepareForTest({ URL.class, MockedHttpConnection.class })
public class Test {
URL mockedURL = PowerMockito.mock(URL.class);
MockedHttpConnection mockedConnection = PowerMockito.mock(MockedHttpConnection.class);
...
PowerMockito.whenNew(URL.class).withParameterTypes(String.class).withArguments("MyURLString").thenReturn(mockedURL);
PowerMockito.when(mockedURL.openConnection()).thenReturn(mockedConnection);
...
}
,我想测试看起来像这样的代码:
URL wlInvokeUrl = new URL(wlInvokeUrlString);
connection = (HttpURLConnection) wlInvokeUrl.openConnection();
在我的测试场景之前我嘲笑wlInvokeUrlString匹配“MyURLString”。我也尝试过使用whenNew行的各种其他形式,试图注入模拟。无论我尝试什么,它都不会拦截构造函数。我想要做的就是“捕捉”openConnection()的调用,并让它返回我的模拟HTTP连接而不是真正的连接。
我在同一个脚本中嘲笑了这个之前的其他类,并且这些工作正常。要么我需要第二双眼睛(可能是真的),或者URL类有一些独特的东西。我注意到,如果我使用“whenNew(URL.class).withAnyArguments()”并将“thenReturn”更改为“thenAnswer”,我可以触发它。唯一的问题是我从来没有得到我的代码的URL调用。我看到的是URL.class的三参数构造函数的调用,所有参数都为空。这个类是否来自Java运行时并且由测试运行器引导?任何帮助深表感谢。
你不需要Powermock来测试这个。只是模拟字符串url,例如使用基于文件的路径(“file://my-test.properties”)。这将起作用,并且你可以传递你需要的数据 –
@JérémieB你能详细说明一下吗?这看起来像是一个优雅而简单的解决方案,但被测试的代码需要HttpURLConnection,如果我将URL字符串更改为引用文件(即java.lang.ClassCastException:sun.net.www.protocol。),我会得到一个ClassCastException。 ftp.FtpURLConnection不能转换为java.net.HttpURLConnection)。另外,如何使用这种方法验证请求上的输入参数? – Jim
您不应该直接使用'HttpURLConnection',而是使用'URL'和'URLConnection'。 'HttpURLConnection'没有什么用处。这是URL抽象传输层的目的。 –