单元测试Apache-Camel JmsReply路由流 - java

我有以下示例路由流,我在其中收到一条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");

只是在.to("mock:done")路线的末尾添加了"Build & Send Http Request"定义。从给定的问题陈述中,不清楚.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(Boot)之上使用Camel,则可能还需要阅读如何test Camel with Spring enabled

Camel Netty UDP侦听器在0.0.0.0上侦听并且未接收到数据包 - java

我是Camel,Netty和UDP的新手,但我已经对此进行了一段时间的研究,但仍然不知道发生了什么。我要做的就是使用Camel和Netty实现UDP侦听器(当前在Windows 7上,但会将项目迁移到Linux)。我的spring配置如下:<camel:camelContext id="test"> <camel:rou…

Spring MVC拦截器映射问题 - java

我有这段XML:<mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/statics/**" /> <bean class="com.company.website.servlet.StaticsHandlerIntercept…

Spring Boot如何在POST之后返回响应 - java

我想创建一个新客户并在创建客户后返回客户编号。客户编号必须是从50000开始的自动递增的唯一编号。到目前为止,我已经成功创建了一个客户,但是我不确定应该如何生成客户编号,将其保存到数据库中,并在触发POST时将其作为成功消息显示给用户。json下面是所需的响应;{ "customerNumber": "50002", …

Spring中的应用程序上下文有什么作用? - java

我昨天问了一个问题(Using Spring in standalone apps),有关如何在独立应用程序中使用Spring。由此得知,您只创建一次应用程序上下文对象。因此,现在的问题是(即使在评论中得到了部分回答)创建应用程序上下文时会发生什么?当您说时,Spring是否会创建这些豆子并将它们连接在一起new ClassPathXmlApplicatio…

注解中的Spring属性值 - java

如何获取注释内的属性值。例如我有一个注释@GetMyValue(value1="Val1",intVal=10) 现在,我希望“ Val1”和10来自属性文件。我试过了@GetMyValue(value1="${test.value}",intVal="${test.int.value}") 这不起…