我正在尝试为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);
}
答案 0 :(得分:0)
我现在没有一个带有Retrofit的项目来确认答案,但是您应该:
假设您要运行单元测试,这意味着您应该将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());
}