无法使用PowerMockito/Mockito模拟URL类

Jim*_*Jim 6 junit mocking mockito powermock powermockito

我正在尝试使用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);

...
}
Run Code Online (Sandbox Code Playgroud)

我想测试的代码如下所示:

URL wlInvokeUrl = new URL(wlInvokeUrlString);
connection = (HttpURLConnection) wlInvokeUrl.openConnection();
Run Code Online (Sandbox Code Playgroud)

在我的测试场景中,我模拟了wlInvokeUrlString以匹配"MyURLString".我也试过使用各种其他形式的whenNew行,试图注入模拟.无论我尝试什么,它都不会拦截构造函数.我想要做的就是"捕获"对openConnection()的调用并让它返回我的模拟HTTP连接而不是真实连接.

我在同一个脚本中先在这个类之前模拟了其他类,这些类按预期工作.要么我需要第二双眼睛(可能是真的),或者URL类有一些独特之处.我注意到如果我使用"whenNew(URL.class).withAnyArguments()"并将"thenReturn"更改为"thenAnswer",我可以触发它.唯一的问题是我从来没有得到我的代码的URL调用.我看到的是对URL.class的3参数构造函数的调用以及参数的所有空值.难道这个类来自Java运行时并且由测试运行器引导?任何帮助深表感谢.

小智 0

我不确定.withParameterTypes(x)和之间的区别.withArguments(x),但我相信您需要按如下方式进行设置才能使您的代码正常工作。尝试一下,如果没有帮助请告诉我。

PowerMockito.when(mockedURL.openConnection()).thenReturn(mockedConnection);
PowerMockito.whenNew(URL.class).withArguments(Mockito.anyString()).thenReturn(mockedURL);
Run Code Online (Sandbox Code Playgroud)