Как написать тестовый блок или Mock Retrofit - PullRequest
0 голосов
/ 19 марта 2020

Я пытаюсь написать тестовый блок для Retrofit, который я использую для вызова API Api для извлечения деталей из токена Google. Пожалуйста, помогите mw издеваться над этим классом

Tech Stack Springboot (JUnit 4) mockito

Я хочу написать контрольный пример для этой функции Это моя функция

public String extractGmail(String googleToken) throws IOException {

    final Call<GmailDTO> call = googleTokenValidatorAPI.authenticateUsingGmail(googleToken);
    final Response<GmailDTO> response = call.execute();

    if (response.isSuccessful() && response.body().getHd().equals("nineleaps.com")) {
        return response.body().getEmail();
    }
    throw new Unauthorized("Token Invalid");
}

GmailDTO используется для хранения ответа от call.execute ()

GmailDTO

publi c class GmailDTO {

private String atHash;
private String sub;
private boolean emailVerified;
private String kid;
private String iss;
private String typ;
private String givenName;
private String locale;
private String picture;
private String aud;
private String azp;
private String name;
private String hd;
private long exp;
private String familyName;
private long iat;
private String alg;
private String email;
private String jti;

}

Это мой Класс конфигурации для Retrofit

@ Configuration publi c, класс GmailLoginConfig {

@Bean
public GoogleTokenValidatorAPI googleTokenValidatorAPI() {
    Retrofit retrofit = new Retrofit.Builder().baseUrl("https://www.googleapis.com/")
            .addConverterFactory(GsonConverterFactory.create()).build();
    return retrofit.create(GoogleTokenValidatorAPI.class);
}

} ​​

и класс GoogleTokenValidatorAPI равен

@ Configuration publi c интерфейс GoogleTokenValidatorAPI {

@POST("oauth2/v3/tokeninfo")
Call<GmailDTO> authenticateUsingGmail(@Query("id_token") String token);

}

Ответы [ 2 ]

0 голосов
/ 20 марта 2020
Finally this worked!!,

@Test
    public void extractGmail() throws IOException {

        GmailDTO expectedDTO= new GmailDTO();
        expectedDTO.setHd("domain");
        expectedDTO.setEmail("Email");

        Response<GmailDTO> expectedResponse= Response.success(expectedDTO);
        Call<GmailDTO> call= mock(Call.class);

        when(googleTokenValidatorAPI.authenticateUsingGmail(ArgumentMatchers.anyString())).thenReturn(call);
        when(call.execute()).thenReturn(expectedResponse);
        GoogleTokenValidatorAPI googleTokenValidatorAPI= mock(GoogleTokenValidatorAPI.class);

        userAdminServiceImplements.extractGmail(ArgumentMatchers.anyString());
    }
0 голосов
/ 20 марта 2020

У меня сейчас нет проекта с Retrofit, чтобы точно проверить ответ, однако вы должны:

  1. Выберите, какие тесты вы хотите запустить: модульный тест, интеграционный тест , et c?
  2. Выберите правильный инструмент

Скажем, вы хотите запустить модульное тестирование, это означает, что вы должны рассматривать интерфейс GoogleTokenValidatorAPI как обычный интерфейс java , Модульные тесты не запускаются весной и не используют никакой вид HttpConnection, поэтому вам не нужно ничего делать с модернизацией, в частности:

GMailDTO expectedDTO = new GMailDTO(...);
Response<GMailDTO> expectedResponse = Response.success(expectedDTO);
Call<GmailDTO> call = Mockito.mock(Call.class);
Mockito.when(call.execute()).thenReturn(expectedResponse);

GoogleTokenValidatorAPI googleTokenValidatorAPI = Mockito.mock(GoogleTokenValidatorAPI.class);

Mockito.when(googleTokenValidatorAPI.authenticateUsingGmail(googleToken)).thenReturn(call);
....

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

Однако вы не сможете проверить, что GmailDTO возвращенный с сервера действительно имеет ту же структуру, что и вы ожидаете (подумайте о гипотетической ситуации, когда Google решил изменить API), он также не будет проверять, что аннотации, которые вы добавили в интерфейс для модификации, действительно допустимо (путь, ожидаемые заголовки и т. д. c.). Для этого вам нужно создать тест, который время от времени действительно вызывает Google (это означает, что технически запустите его с помощью Spring, который создаст заглушку прокси-клиента клиента во время выполнения). Технически это не будет модульное тестирование, и, как правило, вы не захотите запускать его для каждой сборки (это ваше решение в основном). Однако такой тест не имеет ничего общего с вашим собственным кодом вокруг вызова, поэтому я сосредоточился в основном на модульном тестировании.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...