【问题标题】:How to write unit test case or Mock Retrofit如何编写单元测试用例或模拟改造
【发布时间】:2020-06-30 14:41:21
【问题描述】:

我正在尝试为 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);

}

【问题讨论】:

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


    【解决方案1】:

    我现在没有使用 Retrofit 的项目来确定答案,但是您应该:

    1. 选择您要运行哪种测试:单元测试、集成测试等?
    2. 选择合适的工具

    假设您要运行单元测试,这意味着您应该将GoogleTokenValidatorAPI 接口视为常规 java 接口。单元测试不启动 spring 并且不使用任何类型的 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 确实与您预期的结构相同(想想谷歌决定更改 API 的假设情况),它不会还要检查您在改造界面上添加的注释是否确实有效(路径、预期的标题等)。为此,您需要创建一个测试,该测试有时确实会调用 google(这意味着从技术上讲,使用 spring 运行它,这将在运行时创建一个改造客户端存根代理)。从技术上讲,它不会是一个单元测试,通常你可能不想为每个构建运行它(基本上是你的决定)。然而,这样的测试与您自己的调用代码无关,这就是我主要关注单元测试方法的原因。

    【讨论】:

    • 感谢您的帮助。上述解决方案效果很好。
    【解决方案2】:
    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());
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-29
      • 1970-01-01
      相关资源
      最近更新 更多