gpt4 book ai didi

java - 如何编写单元测试用例或 Mock Retrofit

转载 作者:行者123 更新时间:2023-12-01 17:53:33 24 4
gpt4 key购买 nike

我正在尝试为 Retrofit 编写单元测试用例,我用它来进行 Google Api 调用以从 google token 中提取详细信息。请帮助mw模拟这个类

技术堆栈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

公开课 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 配置类

@配置公共(public)类 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 类是

@配置公共(public)接口(interface) GoogleTokenValidatorAPI {

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

}

最佳答案

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

  1. 选择您要运行什么类型的测试:单元测试、集成测试等?
  2. 选择正确的工具

假设您要运行单元测试,这意味着您应该将 GoogleTokenValidatorAPI 接口(interface)视为常规 java 接口(interface)。单元测试不会启动 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 是否确实具有与您预期相同的结构(考虑一下 google 决定更改 API 时的假设情况) ,它也不会检查您在改造接口(interface)上添加的注释是否确实有效(路径、预期 header 等)。为此,您需要创建一个测试,偶尔确实会调用 google (这意味着从技术上讲,使用 spring 运行它,它将在运行时创建一个改进的客户端 stub 代理)。从技术上讲,它不会是单元测试,通常您可能不想为每个构建运行它(基本上是您的决定)。然而,这样的测试与您自己的调用代码无关,这就是为什么我主要关注单元测试方法。

关于java - 如何编写单元测试用例或 Mock Retrofit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60757583/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com