如何模拟URL连接

Nem*_*min 8 java junit jmockit mocking powermock

嗨,我有一个方法,将URL作为输入,并确定它是否可访问.下面是代码:

public static boolean isUrlAccessible(final String urlToValidate) throws WAGNetworkException {
        URL url = null;
        HttpURLConnection huc = null;
        int responseCode = -1;
        try {
            url = new URL(urlToValidate);
            huc = (HttpURLConnection) url.openConnection();
            huc.setRequestMethod("HEAD");
            huc.connect();
            responseCode = huc.getResponseCode();
        } catch (final UnknownHostException e) {
            throw new WAGNetworkException(WAGConstants.INTERNET_CONNECTION_EXCEPTION);
        } catch (IOException e) {
            throw new WAGNetworkException(WAGConstants.INVALID_URL_EXCEPTION);
        } finally {
            if (huc != null) {
                huc.disconnect();
            }
        }
        return responseCode == 200;
    }
Run Code Online (Sandbox Code Playgroud)

我想使用isUrlAccessible()方法对单元进行单元测试PowerMockito.我觉得我需要用来whenNew()模拟创建URLurl.openConnection()调用的时候,返回另一个模拟HttpURLConnection对象.但我不确定如何实现这个?我是在正确的轨道上吗?任何人都可以帮我实现这个吗?

Sez*_*rli 5

您可以使用以下方式模拟新的 Url 实例

whenNew(URL.class)..
Run Code Online (Sandbox Code Playgroud)

确保从 whenNew 调用返回之前创建的模拟对象。

URL mockUrl = Mockito.mock(URL.class);
whenNew(URL.class).....thenReturn(mockUrl );
Run Code Online (Sandbox Code Playgroud)

然后您可以根据需要向模拟添加行为。

  • 我们不能模拟最终类(URL) (2认同)

Nem*_*min 5

找到了解决方案.首先模拟URL类,然后模拟HttpURLConnection,当调用url.openconnection()时,返回这个模拟的HttpURLConnection对象,最后将其响应代码设置为200.继承代码:

@Test
    public void function() throws Exception{
        RuleEngineUtil r = new RuleEngineUtil();
        URL u = PowerMockito.mock(URL.class);
        String url = "http://www.sdsgle.com";
        PowerMockito.whenNew(URL.class).withArguments(url).thenReturn(u);
        HttpURLConnection huc = PowerMockito.mock(HttpURLConnection.class);
        PowerMockito.when(u.openConnection()).thenReturn(huc);
        PowerMockito.when(huc.getResponseCode()).thenReturn(200);
        assertTrue(r.isUrlAccessible(url));

    }
Run Code Online (Sandbox Code Playgroud)

  • 这是否有效,它在"PowerMockito.when(u.openConnection())"行中给出了一个错误.然后返回(huc);``,说出AbstractMethodError. (8认同)
  • 对于模拟 URL,您还应该考虑按照 http://vaguehope.com/2012/02/powermock-puzzler/ 添加 @PrepareForTest({URL.class, <YourImplementationClass>}) (2认同)