java - 单元测试 Apache-Camel JmsReplyTo 路由流程

标签 java spring-boot junit apache-camel spring-camel

我有以下示例路由流,其中我接收 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); 实际做了什么。您还可以将此模拟端点传播添加到“构建 XML 响应” 路由,在这种情况下,您需要进一步的路由建议定义。

接下来,您可以让 Camel 通过

注入(inject)模拟端点
@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

关于java - 单元测试 Apache-Camel JmsReplyTo 路由流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55899667/

相关文章:

java - 将 pdf 文档合并到单页 iText 中

java - 是否有任何实用程序可以将 visio 流程图转换为 Java 代码?

java - 如何使用基于java的配置将队列绑定(bind)到交换

java - 使用SpringBootTest和Autowired注解时LogCaptor捕获失败

java - Jetty 9 HTTP客户端: How to get the request content?

java - Selenium Webdriver - 能够通过 firebug 定位元素,但在 Webdriver 中出现 nosuchelementException

java - 在 Java 中将带有列表值的映射转换为列表

rest - org.springframework.http.MediaType 中的无效 token 字符 '/'

java - junit:开发测试用例的最佳实践?

java - 运行具有属性文件关联的 Junit 时如何访问 XML 文件?