Макет URL и HttpURLConnection с использованием PowerMockito - PullRequest
0 голосов
/ 04 сентября 2018

У меня возникла проблема при проверке URL и класса HttpURLConnection. TestNG используется в качестве основы тестирования из-за имеющегося у нас ограничения.

Тестовый класс выглядит следующим образом

package com.ericsson.msran.test.stability.environmentmanager.service.batc.restore;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import org.apache.http.entity.ContentType;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PowerMockIgnore;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import org.powermock.modules.testng.PowerMockTestCase;
import org.testng.Assert;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;

import com.ericsson.msran.test.stability.environmentmanager.service.Service;
import com.ericsson.msran.test.stability.environmentmanager.service.ServiceException;
import com.ericsson.msran.test.stability.environmentmanager.service.batc.BatCConfig;
import com.ericsson.msran.test.stability.environmentmanager.service.batc.BatCServiceException;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;

@PowerMockIgnore({ "org.apache.logging.log4j.*" })
@RunWith(PowerMockRunner.class) 
@PrepareForTest({ BatCConfig.class, Service.class })
public class RestoreSnapshotServiceTest extends PowerMockTestCase {

    HttpURLConnection httpURLConnection;
    URL mockedURL;

    @BeforeClass
    public void setUp() throws MalformedURLException, IOException {
        MockitoAnnotations.initMocks(this);
        PowerMockito.mockStatic(BatCConfig.class);
    }

    @Test
    public void testRestoreSnapshot() throws Exception {
        String jsonResponse = "{\"apiVersion\":\"0.1.0\",\"method\":\"restoreCampaignSnapshot\",\"params\":{\"campaignSnapshotId\":3,\"campaignName\":\"testCampaign3\"},\"data\":{\"newCampaignId\":607}}";
        JsonObject response = new JsonParser().parse(jsonResponse).getAsJsonObject();
        Mockito.when(BatCConfig.getBatCServiceUrl()).thenReturn(new URL("https://lte-iov.rnd.ki.sw.ericsson.se/batc/"));
        mockedURL = PowerMockito.mock(URL.class);
        httpURLConnection = PowerMockito.mock(HttpURLConnection.class);
        PowerMockito.whenNew(URL.class).withArguments("https://lte-iov.rnd.ki.sw.ericsson.se/batc/restoreCampaignSnapshot").thenReturn(mockedURL);
        Mockito.when(mockedURL.openConnection()).thenReturn(httpURLConnection);

        Mockito.when(httpURLConnection.getResponseCode()).thenReturn(HttpURLConnection.HTTP_BAD_GATEWAY);
        Mockito.when(httpURLConnection.getContentType()).thenReturn(ContentType.APPLICATION_JSON.getMimeType());
        Mockito.doNothing().when(httpURLConnection).connect();  
        Mockito.when(httpURLConnection.getOutputStream()).thenReturn(null);
        Mockito.when(httpURLConnection.getInputStream()).thenReturn(new ByteArrayInputStream(jsonResponse.getBytes()));

        String name = RestoreSnapshotService.restoreSnapshot(3, "testCampaign4");

        Assert.assertEquals(name, "testCampaign4");
    }

}

Когда я тестирую реальный класс (Service) в этом случае, макет не используется, а вместо этого реальный объект. Любая помощь приветствуется!

Пример тестируемого кода выглядит следующим образом

protected static JsonObject callEndpoint(URL url, ServiceRequestMethod requestMethod, JsonObject requestBody)
        throws ServiceException {
    HttpURLConnection connection = null;
    try {
        connection = (HttpURLConnection) url.openConnection();
        connection.setRequestProperty(REQUEST_PROP_KEY, REQUEST_PROP_VAL);
        connection.setConnectTimeout(REQUEST_TIMEOUT_MILLIS);
        connection.setReadTimeout(REQUEST_TIMEOUT_MILLIS);
        connection.setRequestMethod(requestMethod.name());
        if (requestMethod == ServiceRequestMethod.POST) {
            connection.setDoOutput(true);
        }
        connection.connect();

        if (requestMethod == ServiceRequestMethod.POST) {
            final OutputStream os = connection.getOutputStream();
            os.write(requestBody.toString().getBytes("UTF-8"));
            os.close();
        }

        final int status = connection.getResponseCode();
        final String contentType = connection.getContentType();

        log("Recieved response with status={} and ContentType={}", status, contentType);

        if (HttpURLConnection.HTTP_OK == status && RESPONSE_TYPE_JSON.equals(contentType)) {
            return mapResponse(connection.getInputStream());
        } else {
            throw new ServiceException("Response from service NOK, status=" + status);
        }
    } catch (IOException e) {
        throw new ServiceException("Could not connect to service", e);
    } finally {
        if (connection != null) {
            connection.disconnect();
        }
    }
}
...