首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用RestClientException测试MockRestServiceServer

如何用RestClientException测试MockRestServiceServer
EN

Stack Overflow用户
提问于 2017-03-03 11:13:59
回答 4查看 26K关注 0票数 16

在测试RestClient实现时,我想模拟一个RestClientException,它可能会被一些RestTemplate抛出,在那个实现f.e中。删除-方法:

代码语言:javascript
复制
@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;
}

我怎样才能做到这一点?

我用这样的方式定义模拟服务器:

代码语言:javascript
复制
@Before
public void setUp() {
    mockServer = MockRestServiceServer.createServer(template);
    client = new MyRestClient(template, serverUrl + ":" + serverPort);
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-03-03 11:21:15

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

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

代码语言:javascript
复制
mockServer.expect(requestTo("your.url"))
                .andExpect(method(HttpMethod.GET/POST....))
                .andRespond(withServerError()...);

在您的示例中,将为客户端HTTP错误抛出RestClientException,因此上面的示例可以通过使用:...andRespond(withBadRequest());...andRespond(withStatus(HttpStatus.NOT_FOUND));4xx异常进行精细调整。

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

票数 11
EN

Stack Overflow用户

发布于 2017-12-11 09:50:56

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

代码语言:javascript
复制
RestTemplate yourApi;
MockRestServiceServer server = MockRestServiceServer.createServer(yourApi);

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

它似乎在测试中起作用:

  • 只有一个RestTemplate电话,
  • 其中,异常是由于上次期望而抛出的。

我无法预期两个连续的异常;MockRestSeriviceServer (更具体的,SimpleRequestExpectationManager)在重放第二个期望时抛出IllegalStateException

票数 15
EN

Stack Overflow用户

发布于 2018-06-06 09:22:05

Alex Ciocan的答复适用于不同的http状态响应,因此如果您想要这些响应,请使用它,因为这是最干净的方法。我有一个问题,我需要能够测试连接重置和其他网络级别的问题,这是比较棘手的模拟。

MaDa的回答适用于某些用例,但在使用AsyncRestTemplate时对我不起作用,因为它抛出的时间太早。不过,这确实让我走向了正确的方向。这一项似乎也适用于异步调用:

代码语言:javascript
复制
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

// ...

ClientHttpResponse exceptionThrowingResponse = mock(ClientHttpResponse.class);

when(exceptionThrowingResponse.getStatusCode()) // getRawStatusCode() in latest spring
    .thenThrow(new IOException("connection reset"));

mockServer.expect(requestTo("http://localhost:123/callme"))
    .andRespond((response) -> exceptionThrowingResponse);

这似乎也适用于连续的异常,以及不同的http状态。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42577392

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档