我正在尝试使用PowerMockito模拟我要测试的代码中Java.net.URL类的创建。基本上,我想防止真正的HTTP请求发生,而是 1)检查请求时的数据和2)在模拟响应上提供自己的测试数据。以下是我的尝试:
@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语句来注入mock。无论我尝试什么,它都从未拦截构造函数。我想要做的就是“捕获”对openConnection()的调用,并将其返回我的模拟HTTP连接而不是真实的连接。
在这个脚本中,我已经模拟了其他类,并且它们按预期工作。也许我需要第二个人的帮助(很可能是真的),或者URL类有一些独特的东西。我注意到,如果我使用"whenNew(URL.class).withAnyArguments()"并将"thenReturn"更改为"thenAnswer",我可以触发它。唯一的问题是我从未收到过我的代码的URL调用。我看到的是调用URL.class的三参数构造函数,其中所有参数都为null。难道这个类来自Java运行时,并由测试运行器引导?非常感谢您的帮助。
HttpURLConnection
,而是使用URL
和URLConnection
。在HttpURLConnection
中没有任何有用的东西。URL 的目的是抽象传输层。 - Jérémie B