我需要對使用 RestTemplate 進行外部 API 呼叫的方法進行單元測驗,我正在嘗試模擬外部 API 的回應并斷言該方法的回傳值。我還嘗試使用MockRestServiceServer和模擬回應,@InjectMocks但無法獲得預期的輸出并且它進行了實際的 API 呼叫。任何指導將不勝感激。
測驗用例
public class SnowFlakeServiceTest {
private final RestTemplate restTemplate = Mockito.mock(RestTemplate.class);
private final SnowFlakeServiceImpl snowFlakeService = new SnowFlakeServiceImpl(restTemplate);
@Test
public void testGetAccessToken() {
SnowFlakeTokenDTO snowFlakeTokenDTO = new SnowFlakeTokenDTO();
snowFlakeTokenDTO.setAccessToken("fakeAccessToken");
snowFlakeTokenDTO.setExpiresIn(600);
snowFlakeTokenDTO.setTokenType("Bearer");
ResponseEntity<SnowFlakeTokenDTO> responseEntity = new ResponseEntity<>(snowFlakeTokenDTO, HttpStatus.OK);
when(restTemplate.exchange(
ArgumentMatchers.anyString(),
ArgumentMatchers.any(HttpMethod.class),
ArgumentMatchers.any(),
ArgumentMatchers.<Class<SnowFlakeTokenDTO>>any()))
.thenReturn(responseEntity);
assertThat(snowFlakeService.getAccessToken()).isEqualTo(snowFlakeTokenDTO.getAccessToken());
}
}
雪花服務Impl.java
private final RestTemplate restTemplate;
public SnowFlakeServiceImpl(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
@Override
public String getAccessToken() {
log.debug("token requested id : {}, secret :{}", snowFlakeClientId, snowFlakeClientSecret);
try {
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
httpHeaders.setBasicAuth(snowFlakeClientId, snowFlakeClientSecret);
MultiValueMap<String, String> requestBody = new LinkedMultiValueMap<>();
requestBody.add("grant_type", snowFlakeRefreshTokenGrantType);
requestBody.add("refresh_token", refreshToken);
requestBody.add("redirect_uri", snowFlakeRedirectUrl);
HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(requestBody, httpHeaders);
ResponseEntity<SnowFlakeTokenDTO> response = restTemplate.exchange(snowFlakeTokenRequestUrl, HttpMethod.POST, request, SnowFlakeTokenDTO.class);
log.debug("response: {}", response);
return Objects.requireNonNull(response.getBody()).getAccessToken();
} catch (Exception e) {
log.debug("error: {}", ExceptionUtils.getRootCauseMessage(e));
throw new ErrorDTO(Status.BAD_REQUEST, accessTokenErrorMessage, e.getMessage());
}
}
RestTemplateConigurations.java
@Configuration
public class RestTemplateConfiguration {
@Value("${rest-template.connection.timeout}")
private int connectionTimeout;
@Value("${rest-template.read.timeout}")
private int readTimeout;
@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder) {
return builder
.setConnectTimeout(Duration.ofMillis(connectionTimeout))
.setReadTimeout(Duration.ofMillis(readTimeout))
.build();
}
}
Spring Boot:2.5.4
Java:11
Junit:5
uj5u.com熱心網友回復:
RestTemplate每次呼叫該getAccessToken()方法時都不需要 new 。它應該由 Spring 注入:
@Service
public class SnowFlakeService {
private RestTemplate restTemplate;
public ServiceImpl(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
@Override
public String getAccessToken() {
try {
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
httpHeaders.setBasicAuth(snowFlakeClientId, snowFlakeClientSecret);
MultiValueMap<String, String> requestBody = new LinkedMultiValueMap<>();
requestBody.add("grant_type", snowFlakeRefreshTokenGrantType);
requestBody.add("refresh_token", refreshToken);
requestBody.add("redirect_uri", snowFlakeRedirectUrl);
HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(requestBody, httpHeaders);
ResponseEntity<SnowFlakeTokenDTO> response = restTemplate.exchange(snowFlakeTokenRequestUrl, HttpMethod.POST, request, SnowFlakeTokenDTO.class);
return Objects.requireNonNull(response.getBody()).getAccessToken();
} catch (Exception e) {
throw new ErrorDTO(Status.BAD_REQUEST, accessTokenErrorMessage, e.getMessage());
}
}
}
最重要的是,您實際上并不需要 a@SpringBootTest來測驗SnowFlakeService. 常規的單元測驗幾乎沒問題。
public class SnowFlakeServiceTest {
private RestTemplate restTemplate = Mockito.mock(RestTemplate.class);
private SnowFlakeService snowFlakeService = new SnowFlakeService(restTemplate);
@Test
public void testGetAccessToken() {
SnowFlakeTokenDTO snowFlakeTokenDTO = new SnowFlakeTokenDTO();
snowFlakeTokenDTO.setAccessToken("fakeAccessToken");
snowFlakeTokenDTO.setExpiresIn(600);
snowFlakeTokenDTO.setTokenType("Bearer");
ResponseEntity<SnowFlakeTokenDTO> responseEntity = new ResponseEntity<>(snowFlakeTokenDTO, HttpStatus.OK);
when(restTemplate.exchange(
ArgumentMatchers.anyString(),
ArgumentMatchers.any(HttpMethod.class),
ArgumentMatchers.any(),
ArgumentMatchers.<Class<SnowFlakeTokenDTO>>any()))
.thenReturn(responseEntity);
assertThat(snowFlakeService.getAccessToken()).isEqualTo(snowFlakeTokenDTO.getAccessToken());
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/363551.html
上一篇:當@Column未用于所有成員時,JPA注釋的POJO未正確映射
下一篇:Quarkus單元測驗和屬性
