javajunitmockingpowermockjmockit

how to mock a URL connection


Hi I have a method that takes an URL as an input and determines if it is reachable. Heres the code for that:

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;
    }

I want to unit test the isUrlAccessible() method using PowerMockito. I feel that I will need to use whenNew() to mock the creation of URL and the when url.openConnection() is called, return another mock HttpURLConnection object. But I have am not sure how to implement this? Am I on the right track? Can anyone help me in implementing this?


Solution

  • Found the solution. First mock the URL class, then Mock the HttpURLConnection and when url.openconnection() is called, return this mocked HttpURLConnection object and finally set its response code to 200. Heres the code:

    @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));
    
        }