如何编写单元测试用例或模拟改造

时间:2020-03-19 12:47:23

标签: java spring-boot unit-testing mockito retrofit

我正在尝试为Retrofit编写单元测试用例,用于进行Google Api调用以从Google令牌中提取详细信息。 请帮助mw模拟此类

技术栈 春靴 (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

公共类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;

}

这是我的改装配置类

@配置 公共类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类为

@配置 公用接口GoogleTokenValidatorAPI {

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

}

2 个答案:

答案 0 :(得分:0)

我现在没有一个带有Retrofit的项目来确认答案,但是您应该:

  1. 选择要运行哪种测试:单元测试,集成测试等?
  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的假设情况),也不要检查您在改造界面上添加的注释是否确实有效(路径,预期的标头等)。为此,您需要创建一个确实偶尔会调用google的测试(这意味着从技术上讲,它是通过spring运行的,它将在运行时创建翻新的客户端存根代理)。从技术上讲,它不是单元测试,通常您可能不想为每个构建都运行它(基本上是您的决定)。但是,这样的测试与您自己的调用代码无关,这就是为什么我主要关注单元测试方法的原因。

答案 1 :(得分:0)

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