Модульный тест с использованием HTTPUrlConnection - PullRequest
0 голосов
/ 08 марта 2019

Я написал код в нашем приложении Spring Boot 2 для вызова стороннего API с помощью HTTPUrlConnection.

public String loginApi(LoginDTO loginDto)
{
    String responseData = null;
    HttpURLConnection conn = null;
    try {
        link = authBaseUrl + loginUrl;
        url = new URL(link);
        conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod("POST");
        conn.setRequestProperty(CONTENT_TYPE, MEDIA_TYPE);
        String body = getAuth0LoginDto(loginDto);
        // =====================
        // For POST only - START
        conn.setDoOutput(true);
        OutputStream os = conn.getOutputStream();
        os.write(body.getBytes(StandardCharsets.UTF_8));
        os.flush();
        os.close();
        // For POST only - END
        // ====================

        try (BufferedReader br = (conn.getResponseCode() >= 400
                ? new BufferedReader(new InputStreamReader(conn.getErrorStream()))
                : new BufferedReader(new InputStreamReader(conn.getInputStream())))) {

            StringBuilder everything = new StringBuilder();
            String output = null;
            while ((output = br.readLine()) != null) {
                everything.append(output);
            }
            responseData = everything.toString();
        }
    } catch (JsonProcessingException e) {
        throw new Auth0Exception("Could not create Auth0 Login Body", e);
    } catch (IOException e) {
        throw new Auth0Exception("Error with Login API", e);
    } finally {
        if (conn != null) {
            conn.disconnect();
        }
    }
    return responseData;
}

Теперь я очень привык проводить настоящее интеграционное тестирование, когда я делаю реальный звонок в веб-сервис и проверяю результаты.

Теперь меня просят строго использовать Mockito, а не PowerMockito, не EasyMock, для создания насмешливых тестов, и я никогда раньше этого не делал. Мое знание Мокито также слабое, так как я не использовал его в течение очень долгого времени.

Итак, я знаю, что об этом уже спрашивали, и я действительно искал в Интернете, и я действительно не нашел полный кусок кода в качестве примера. Я вижу фрагменты кода, из-за которых у меня не хватает частей, и я недостаточно осведомлен, чтобы добавлять эти части самостоятельно.

Я знаю, что фактическая реализация этого кода работает нормально, и тест интеграции также работает отлично. Но то, что я видел раньше, это то, что некоторым пользователям говорят, что им нужно изменить свой клиентский код, чтобы тесты mockito работали.

Если я не получу тесты на макетирование, работающие для HTTPUrlConnection, то я буду вынужден переключиться на RestTemplate и Mocking, поскольку мой коллега настаивает на том, чтобы мы все равно использовали RestTemplate.

Спасибо!

1 Ответ

1 голос
/ 08 марта 2019

Поскольку вы попросили небольшой пример, который не имеет смысла, но должен показать идею:

import java.io.IOException;
import java.io.UncheckedIOException;
import java.net.HttpURLConnection;
import java.net.URL;

public class App {

  public int status(URL url) {
    HttpURLConnection urlConnection = null;
    try {
      urlConnection = create(url);
      return urlConnection.getResponseCode();
    } catch (IOException e) {
      throw new UncheckedIOException(e);
    } finally {
      if (urlConnection != null) {
        urlConnection.disconnect();
      }
    }
  }

  HttpURLConnection create(URL url) throws IOException {
    return (HttpURLConnection) url.openConnection();
  }
}

Я бы реализовал это с помощью шпиона и, как я рекомендовал, издеваться HttpURLConnection:

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.Spy;
import org.mockito.junit.jupiter.MockitoExtension;

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

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doReturn;

@ExtendWith(MockitoExtension.class)
class AppTest {

  @Spy
  App app;

  @Mock
  HttpURLConnection connection;


  @Test
  void status() throws IOException {
    int expected = 200;
    doReturn(connection).when(app).create(any());
    doReturn(expected).when(connection).getResponseCode();
    URL url = new URL("http://www.google.ats");
    int status = app.status(url);

    Assertions.assertEquals(expected, status);
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...