在测试RestClient实现时,我想模拟一个RestClientException,它可能会被一些RestTemplate抛出,在那个实现f.e中。删除-方法:
@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);
}发布于 2017-03-03 11:21:15
您可以利用MockRestResponseCreators来模拟来自mockRestServiceServer的4xx或5xx响应。
例如,用于测试5xx内部服务器错误:
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.MockRestServiceServer,org.springframework.test.web.client.response.MockRestResponseCreators
发布于 2017-12-11 09:50:56
您可以测试抛出MockRestServiceServer的运行时异常,尽管这个类(从Spring5.0.0.RC4到Spring5.0.0.RC4)不是为它设计的(这意味着它可能不适用于更复杂的用例):
RestTemplate yourApi;
MockRestServiceServer server = MockRestServiceServer.createServer(yourApi);
server.expect(requestTo("http://..."))
.andRespond((response) -> { throw new ResourceAccessException(
new ConnectException("Connection reset")); });它似乎在测试中起作用:
RestTemplate电话,我无法预期两个连续的异常;MockRestSeriviceServer (更具体的,SimpleRequestExpectationManager)在重放第二个期望时抛出IllegalStateException。
发布于 2018-06-06 09:22:05
Alex Ciocan的答复适用于不同的http状态响应,因此如果您想要这些响应,请使用它,因为这是最干净的方法。我有一个问题,我需要能够测试连接重置和其他网络级别的问题,这是比较棘手的模拟。
MaDa的回答适用于某些用例,但在使用AsyncRestTemplate时对我不起作用,因为它抛出的时间太早。不过,这确实让我走向了正确的方向。这一项似乎也适用于异步调用:
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状态。
https://stackoverflow.com/questions/42577392
复制相似问题