首页 > 解决方案 > 使用 ProducerTemplate 测试时,骆驼身体丢失 500 状态

问题描述

我有一个简单的骆驼路线:

from("jetty:http://localhost:8080/path")
.setBody(simple("<zzz>zzz</zzz>"))
.setHeader(Exchange.HTTP_RESPONSE_CODE, simple("500"))
.setHeader(Exchange.CONTENT_TYPE, simple("application/xml"));

我有一个测试用例,代码如下:

Exchange ex = producerTemplate.request("http://localhost:8080/path", (e) -> {
  e.getIn().setBody(requestBody);
  e.getIn().setHeader("Content-Type", "application/xml");
});

一旦响应代码设置为 500,主体就会返回为空。事实上 ex.hasOut() 是错误的。

使用 curl 进行测试时,会返回主体。所以这是导致问题的 producerTemplate 的测试用例使用。

我需要做什么才能让我期望的身体归还?

标签: unit-testingapache-camel

解决方案


Http 组件将 5xx 状态码转换为HttpOperationFailedException.

您可以使用 option 关闭此行为throwExceptionOnFailure=false

在远程服务器响应失败的情况下禁用抛出 HttpOperationFailedException 的选项。这使您可以获取所有响应,而不管 HTTP 状态代码如何。

Exchange ex = template.request("http://localhost:8080/path?throwExceptionOnFailure=false", (e) -> {
    e.getIn().setBody(requestBody);
    e.getIn().setHeader("Content-Type", "application/xml");
});
log.info(ex.getMessage().getBody());

HttpOperationFailedException或者从对象获取响应体。

Exchange ex = template.request("http://localhost:8080/path", (e) -> {
    e.getIn().setBody(requestBody);
    e.getIn().setHeader("Content-Type", "application/xml");
});
log.info(ex.getException(HttpOperationFailedException.class).getResponseBody());

推荐阅读