如何使用 MockRestServiceServer 测试 RestClientException

2022-09-03 04:48:12

在测试 RestClient-Implementation 时,我想模拟一个 RestClientException,它可能由该实现中的某些 RestTemplate 方法引发,例如 delete-method:

@Override
public ResponseEntity<MyResponseModel> documentDelete(String id) {
    template.setErrorHandler(new MyResponseErrorHandler());
    ResponseEntity<MyResponseModel> response = null;
    try {
        String url = baseUrl + "/document/id/{id}";
        response = template.exchange(url, DELETE, null, MyResponseModel.class, id);
    } catch (RestClientException ex) {
        return handleException(ex);
    }
    return response;
}

我怎样才能做到这一点?

我以这种方式定义模拟服务器:

@Before
public void setUp() {
    mockServer = MockRestServiceServer.createServer(template);
    client = new MyRestClient(template, serverUrl + ":" + serverPort);
}

答案 1

您可以从 中测试抛出运行时异常,尽管从 Spring 5.0.0.RC4 开始,此类不是为它设计的(这意味着它可能不适用于更复杂的用例):MockRestServiceServer

RestTemplate yourApi;
MockRestServiceServer server = MockRestServiceServer.createServer(yourApi);

server.expect(requestTo("http://..."))
    .andRespond((response) -> { throw new ResourceAccessException(
        new ConnectException("Connection reset")); });

它似乎在测试中起作用:

  • 只有一个呼叫的地方,RestTemplate
  • 其中,异常是作为最后一个期望的结果引发的。

我无法指望连续两次例外;(更具体地说,)抛出重放第二个期望。MockRestSeriviceServerSimpleRequestExpectationManagerIllegalStateException


答案 2

您可以利用 MockRestResponseCreators 来模拟来自 mockRestServiceServer 的 4xx 或 5xx 响应。

例如,用于测试 5xx - 内部服务器错误:

mockServer.expect(requestTo("your.url"))
                .andExpect(method(HttpMethod.GET/POST....))
                .andRespond(withServerError()...);

在你的例子中,RestClientException是针对客户端HTTP错误而引发的,因此可以通过使用以下命令对上面的示例进行微调以查找异常:或4xx...andRespond(withBadRequest());...andRespond(withStatus(HttpStatus.NOT_FOUND));

为了更简单地使用这些方法,请使用 静态导入 ,org.springframework.test.web.client.MockRestServiceServerorg.springframework.test.web.client.response.MockRestResponseCreators


推荐