单元测试 Apache-Camel JmsReplyTo 路由流程
Unit Test Apache-Camel JmsReplyTo route flow
我有以下示例路由流,我在其中接收到一条 jms 消息,构建了一个 Web 服务请求,然后使用 Web 服务响应响应 JMSReplyTo:
from("{{jms.input.queue}}).routeId("Receive JMS Message")
.to("direct:start");
from("direct:start").routeId("Build & Send Http Request")
.bean(processRequest)
.to("{{http.endpoint}}")
.to("direct:processResponse");
from("direct:processResponse").routeId("Build XML Response")
.convertBodyTo(String.class)
.bean(processResponse);
我已经成功地对我的流程进行了单元测试,但现在我想对我的路由流进行单元测试。我没有在测试期间使用 EMS 服务器 运行,而是从第二条路线开始:
camelContext.getRouteDefinition("Build & Send Http Request").adviceWith(camelContext,
new AdviceWithRouteBuilder() {
@Override
public void configure() throws Exception {
interceptSendToEndpoint("http://*")
.skipSendToOriginalEndpoint()
.setBody("Hello");
}
});
@Test
@DirtiesContext
public void RouteFlowTest() throws Exception{
Map<String,Object> jmsHeaders = new HashMap<>();
jmsHeaders.put("Auth","helloWorld");
jmsHeaders.put("JMSReplyTo","sample");
String jmsBody = "Help Me"
incomingJmsRequestMessage.sendBodyAndHeaders("direct:start", jmsBody, jmsHeaders);
}
但是现在如何在执行 processResponse bean 后断言交换?
或者有没有一种方法可以从第一条路线开始测试并满足 JMSReplyTo 而无需实际拥有 EMS 服务器运行?
由于您已经在编织路由,因此您可以在路由建议中向模拟端点添加传播,例如:
this.weaveAddLast().to("mock:done");
它只是在 "Build & Send Http Request"
路由的末尾添加了一个 .to("mock:done")
定义。从给定的问题陈述中,有点不清楚 .bean(processResponse);
实际做了什么。您还可以将此模拟端点传播添加到 "Build XML Response"
路由,在这种情况下,您需要进一步的路由建议定义。
接下来,您可以让 Camel 通过
注入模拟端点
@EndpointInject(uri = "mock:done")
private MockEndpoint done;
或通过以下方式在测试中手动定义它:
MockEndpoint done = camelContext.getEndpoint("mock:done", MockEndpoint.class);
此模拟端点可用于 define certain expectations 这样您就可以期望该端点收到一条消息
done.expectedMessageCount(1);
...
// invoke your route here
template.sendBody(...);
...
done.assertIsSatisfied();
您也可以通过以下方向直接访问此端点接收的交换,并对其执行进一步的断言:
Exchange exchange = done.getExchanges().get(0);
...
如果您在 Spring(引导)之上使用 Camel,您还可以通读如何 test Camel with Spring enabled
我有以下示例路由流,我在其中接收到一条 jms 消息,构建了一个 Web 服务请求,然后使用 Web 服务响应响应 JMSReplyTo:
from("{{jms.input.queue}}).routeId("Receive JMS Message")
.to("direct:start");
from("direct:start").routeId("Build & Send Http Request")
.bean(processRequest)
.to("{{http.endpoint}}")
.to("direct:processResponse");
from("direct:processResponse").routeId("Build XML Response")
.convertBodyTo(String.class)
.bean(processResponse);
我已经成功地对我的流程进行了单元测试,但现在我想对我的路由流进行单元测试。我没有在测试期间使用 EMS 服务器 运行,而是从第二条路线开始:
camelContext.getRouteDefinition("Build & Send Http Request").adviceWith(camelContext,
new AdviceWithRouteBuilder() {
@Override
public void configure() throws Exception {
interceptSendToEndpoint("http://*")
.skipSendToOriginalEndpoint()
.setBody("Hello");
}
});
@Test
@DirtiesContext
public void RouteFlowTest() throws Exception{
Map<String,Object> jmsHeaders = new HashMap<>();
jmsHeaders.put("Auth","helloWorld");
jmsHeaders.put("JMSReplyTo","sample");
String jmsBody = "Help Me"
incomingJmsRequestMessage.sendBodyAndHeaders("direct:start", jmsBody, jmsHeaders);
}
但是现在如何在执行 processResponse bean 后断言交换?
或者有没有一种方法可以从第一条路线开始测试并满足 JMSReplyTo 而无需实际拥有 EMS 服务器运行?
由于您已经在编织路由,因此您可以在路由建议中向模拟端点添加传播,例如:
this.weaveAddLast().to("mock:done");
它只是在 "Build & Send Http Request"
路由的末尾添加了一个 .to("mock:done")
定义。从给定的问题陈述中,有点不清楚 .bean(processResponse);
实际做了什么。您还可以将此模拟端点传播添加到 "Build XML Response"
路由,在这种情况下,您需要进一步的路由建议定义。
接下来,您可以让 Camel 通过
注入模拟端点@EndpointInject(uri = "mock:done")
private MockEndpoint done;
或通过以下方式在测试中手动定义它:
MockEndpoint done = camelContext.getEndpoint("mock:done", MockEndpoint.class);
此模拟端点可用于 define certain expectations 这样您就可以期望该端点收到一条消息
done.expectedMessageCount(1);
...
// invoke your route here
template.sendBody(...);
...
done.assertIsSatisfied();
您也可以通过以下方向直接访问此端点接收的交换,并对其执行进一步的断言:
Exchange exchange = done.getExchanges().get(0);
...
如果您在 Spring(引导)之上使用 Camel,您还可以通读如何 test Camel with Spring enabled