我可以在 java 方法中模拟 rest 调用吗
Can I mock a rest call within a java method
我有2个方法,我想调用第一个public方法,它又会调用一个私有方法,在私有方法中我想调用一个外部服务并模拟一个500来自那里的 GET 请求的内部服务错误。我知道如何模拟整个私有方法,但这行不通我想看看当我从外部服务返回 500 时具体发生了什么。
这是我正在测试的 2 种方法的样子..
@Resource(name = "serviceRestTemplate")
private OAuth2RestTemplate serviceRestTemplate;
public ResponseEntity<Cargo> getById(String id) throws MyException {
UriComponentsBuilder newUri = UriComponentsBuilder
.fromHttpUrl(url + id + HEADER_URI);
ResponseEntity<String> responseEntity = this.callNewService(newUri, HttpMethod.GET);
// more irrelivent code...
}
private ResponseEntity<String> callNewService(UriComponentsBuilder uriBuilder, HttpMethod method) throws MyException {
ResponseEntity<String> responseEntity = null;
try {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<String> requestEntity = new HttpEntity<>(headers);
responseEntity = serviceRestTemplate.exchange(uriBuilder.toUriString(),
method, requestEntity, String.class);
}catch(HttpClientErrorException httpClientErrorException) {
LOGGER.error("Error when calling Service. {} ", uriBuilder.toUriString());
LOGGER.error("Error message from HttpClientErrorException . {} ", httpClientErrorException.getMessage());
throw buildException(httpClientErrorException.getMessage(), httpClientErrorException.getRawStatusCode());
}
if(null != responseEntity
&& responseEntity.getStatusCode().is2xxSuccessful()
&& EDMRESTServiceUtilities.isJsonValid(responseEntity.getBody())) {
LOGGER.info("Service response: {}", responseEntity.getBody());
return responseEntity;
}else {
LOGGER.error("Error response from Service. {} ", uriBuilder.toUriString());
throw buildException(SERVICE_ERROR_MESSAGE, HttpStatus.INTERNAL_SERVER_ERROR.value());
}
}
您可以在测试中模拟您的 serviceRestTemplate
和对 exchange
的调用,并将您的注入方法更改为构造函数注入,这样可以更轻松地在您的 [=14= 中使用模拟].
我有2个方法,我想调用第一个public方法,它又会调用一个私有方法,在私有方法中我想调用一个外部服务并模拟一个500来自那里的 GET 请求的内部服务错误。我知道如何模拟整个私有方法,但这行不通我想看看当我从外部服务返回 500 时具体发生了什么。
这是我正在测试的 2 种方法的样子..
@Resource(name = "serviceRestTemplate")
private OAuth2RestTemplate serviceRestTemplate;
public ResponseEntity<Cargo> getById(String id) throws MyException {
UriComponentsBuilder newUri = UriComponentsBuilder
.fromHttpUrl(url + id + HEADER_URI);
ResponseEntity<String> responseEntity = this.callNewService(newUri, HttpMethod.GET);
// more irrelivent code...
}
private ResponseEntity<String> callNewService(UriComponentsBuilder uriBuilder, HttpMethod method) throws MyException {
ResponseEntity<String> responseEntity = null;
try {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<String> requestEntity = new HttpEntity<>(headers);
responseEntity = serviceRestTemplate.exchange(uriBuilder.toUriString(),
method, requestEntity, String.class);
}catch(HttpClientErrorException httpClientErrorException) {
LOGGER.error("Error when calling Service. {} ", uriBuilder.toUriString());
LOGGER.error("Error message from HttpClientErrorException . {} ", httpClientErrorException.getMessage());
throw buildException(httpClientErrorException.getMessage(), httpClientErrorException.getRawStatusCode());
}
if(null != responseEntity
&& responseEntity.getStatusCode().is2xxSuccessful()
&& EDMRESTServiceUtilities.isJsonValid(responseEntity.getBody())) {
LOGGER.info("Service response: {}", responseEntity.getBody());
return responseEntity;
}else {
LOGGER.error("Error response from Service. {} ", uriBuilder.toUriString());
throw buildException(SERVICE_ERROR_MESSAGE, HttpStatus.INTERNAL_SERVER_ERROR.value());
}
}
您可以在测试中模拟您的 serviceRestTemplate
和对 exchange
的调用,并将您的注入方法更改为构造函数注入,这样可以更轻松地在您的 [=14= 中使用模拟].