unit-testing - 使用 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 的测试用例使用。
我需要做什么才能让我期望的身体归还?
解决方案
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());
推荐阅读
- python - 为什么 PyQt5 QPixmap 会导致 python 崩溃?
- visual-studio-code - 使 VSCode 的注释从第 0 列开始
- assembly - 为什么中断int 21h在程序执行期间写入填充的字符串后会忽略所有字符串?
- javascript - JS - 将参数传递给嵌套参数
- javascript - 用 DOM 节点数组更新 DOM 节点的 childNodes 的最有效方法是什么,并且 DOM 突变的数量最少?
- git - 如何从 intellij IDEA 提交子文件夹 .git 并将其推送到 github?
- jquery - 引导日期选择器:在“显示”事件上将日历弹出窗口上的选定日期设置为今天日期
- java - Java Swing 应用程序导致 ClassNotFoundException
- python - 在 Python 中访问列表的特定元素
- spring - 有没有一种格式可以让我使用 Spring Rest 传输数据而无需序列化/反序列化