【问题标题】:Can I mock a rest call within a java method我可以在 java 方法中模拟休息调用吗
【发布时间】:2021-03-23 11:09:07
【问题描述】:

我有 2 个方法,我想调用第一个公共方法,它又会调用一个私有方法,在私有方法中我想调用外部服务并从 GET 模拟 500 内部服务错误在那里请求。我知道如何模拟整个私有方法,但这不起作用我想看看那里发生了什么,特别是当我从外部服务获得 500 时。

这是我正在测试的两种方法的样子..

@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
  • 您可以使用TestRestTempate 或者您可以使用OkHttp 或Java Spark 之类的东西来创建一个模拟服务以供其余模板连接。鉴于 RestTemplate 不是您“拥有”的接口或类,我不认为模拟它是最好的方法。

标签: java spring unit-testing mocking mockito


【解决方案1】:

您可以在测试中模拟您的serviceRestTemplate 和对exchange 的调用,并将您的注入方法更改为构造函数注入,这样可以更轻松地在您的课程中使用模拟。

【讨论】:

    猜你喜欢
    • 2010-10-11
    • 2011-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-30
    • 2011-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多