Apache camel Camel replaceFromWith并模拟JMS目标-Spring引导

Apache camel Camel replaceFromWith并模拟JMS目标-Spring引导,apache-camel,Apache Camel,我已经检查了《骆驼行动2》第9章的例子,看了这个,但是仍然卡住了 我使用的是Spring boot和Camel 2.18.x 我正在尝试将这两者结合为一:mockEndpoint和replaceFrom 工作场景: from("direct:start") .id("testroute") .log("${body}") //.to("seda:finish") //This works okay

我已经检查了《骆驼行动2》第9章的例子,看了这个,但是仍然卡住了

我使用的是Spring boot和Camel 2.18.x 我正在尝试将这两者结合为一:mockEndpoint和replaceFrom

工作场景:

    from("direct:start")
            .id("testroute")
            .log("${body}")
            //.to("seda:finish")   //This works okay
            .to("jms:XYZ_Q")
     ;
@RunWith(CamelSpringBootRunner.class)
@MockEndpoints
@UseAdviceWith
@SpringBootTest(classes = {UnitTestApplication.class, SampleTest.class})
public class SampleTest {

    @Autowired
    private CamelContext camelContext;

    @Autowired
    private ProducerTemplate producerTemplate;

    @Test
    public void test01() throws Exception {
        RouteDefinition route = camelContext.getRouteDefinition("testroute");
        AdviceWithRouteBuilder adviceWithRB = new AdviceWithRouteBuilder() {
            @Override
            public void configure() throws Exception {
                replaceFromWith("direct:renamed");
            }
        };

        route.adviceWith(camelContext, adviceWithRB);
        camelContext.start();

        producerTemplate.sendBody("direct:renamed", "  8888888820130601");
    }
}
  • 我创建了一个测试路由direct-->seda
  • 我使用Advicewith,并模拟所有端点
  • 我的测试很好
  • 工作场景:

        from("direct:start")
                .id("testroute")
                .log("${body}")
                //.to("seda:finish")   //This works okay
                .to("jms:XYZ_Q")
         ;
    
    @RunWith(CamelSpringBootRunner.class)
    @MockEndpoints
    @UseAdviceWith
    @SpringBootTest(classes = {UnitTestApplication.class, SampleTest.class})
    public class SampleTest {
    
        @Autowired
        private CamelContext camelContext;
    
        @Autowired
        private ProducerTemplate producerTemplate;
    
        @Test
        public void test01() throws Exception {
            RouteDefinition route = camelContext.getRouteDefinition("testroute");
            AdviceWithRouteBuilder adviceWithRB = new AdviceWithRouteBuilder() {
                @Override
                public void configure() throws Exception {
                    replaceFromWith("direct:renamed");
                }
            };
    
            route.adviceWith(camelContext, adviceWithRB);
            camelContext.start();
    
            producerTemplate.sendBody("direct:renamed", "  8888888820130601");
        }
    }
    
  • 我更改了目标,以使用直接-->jms
  • 我在最后得到一个异常,并看到JMS无法创建会话 期望:我假设JMS将被mock取代,而日志似乎表明了这一点。不确定为什么会调用JMSProducer。这是预期的行为吗

    示例路线:

        from("direct:start")
                .id("testroute")
                .log("${body}")
                //.to("seda:finish")   //This works okay
                .to("jms:XYZ_Q")
         ;
    
    @RunWith(CamelSpringBootRunner.class)
    @MockEndpoints
    @UseAdviceWith
    @SpringBootTest(classes = {UnitTestApplication.class, SampleTest.class})
    public class SampleTest {
    
        @Autowired
        private CamelContext camelContext;
    
        @Autowired
        private ProducerTemplate producerTemplate;
    
        @Test
        public void test01() throws Exception {
            RouteDefinition route = camelContext.getRouteDefinition("testroute");
            AdviceWithRouteBuilder adviceWithRB = new AdviceWithRouteBuilder() {
                @Override
                public void configure() throws Exception {
                    replaceFromWith("direct:renamed");
                }
            };
    
            route.adviceWith(camelContext, adviceWithRB);
            camelContext.start();
    
            producerTemplate.sendBody("direct:renamed", "  8888888820130601");
        }
    }
    
    单元测试类:

        from("direct:start")
                .id("testroute")
                .log("${body}")
                //.to("seda:finish")   //This works okay
                .to("jms:XYZ_Q")
         ;
    
    @RunWith(CamelSpringBootRunner.class)
    @MockEndpoints
    @UseAdviceWith
    @SpringBootTest(classes = {UnitTestApplication.class, SampleTest.class})
    public class SampleTest {
    
        @Autowired
        private CamelContext camelContext;
    
        @Autowired
        private ProducerTemplate producerTemplate;
    
        @Test
        public void test01() throws Exception {
            RouteDefinition route = camelContext.getRouteDefinition("testroute");
            AdviceWithRouteBuilder adviceWithRB = new AdviceWithRouteBuilder() {
                @Override
                public void configure() throws Exception {
                    replaceFromWith("direct:renamed");
                }
            };
    
            route.adviceWith(camelContext, adviceWithRB);
            camelContext.start();
    
            producerTemplate.sendBody("direct:renamed", "  8888888820130601");
        }
    }
    
    我希望JMS组件不会尝试做任何事情,而是被mock替换。这是错误的理解吗

    我假设JMS将被mock替代

  • 不,它不会被替换,因为
    replaceFromWith(..)
    将路由的输入(
    from(..)
    )替换为新的端点URI。它应该在以下情况下工作(使用您的示例):

  • 如果您想模拟
    .to(“jms:XYZ_Q”)
    部分(来自您的问题),那么您可以使用
    weaveByIdToString()
    weaveById()
    等函数。更多信息:

  • 我假设JMS将被mock替代

  • 不,它不会被替换,因为
    replaceFromWith(..)
    将路由的输入(
    from(..)
    )替换为新的端点URI。它应该在以下情况下工作(使用您的示例):

  • 如果您想模拟
    .to(“jms:XYZ_Q”)
    部分(来自您的问题),那么您可以使用
    weaveByIdToString()
    weaveById()
    等函数。更多信息: