Apache Camel Spring Javaconfig单元测试端点上没有消费者可用

时间:2015-10-08 09:22:12

标签: spring unit-testing apache-camel

我有以下路线配置:

@Component
public class MyRoute extends RouteBuilder {
    @Override
    public void configure() throws Exception {
        from("direct:in").to("direct:out");
    }
}

当我尝试测试时:

@RunWith(CamelSpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { MyRouteTest.TestConfig.class }, loader = CamelSpringDelegatingTestContextLoader.class)
@MockEndpoints
public class MyRouteTest {
    @EndpointInject(uri = "mock:direct:out")
    private MockEndpoint mockEndpoint;

    @Produce(uri = "direct:in")
    private ProducerTemplate producerTemplate;

    @Configuration
    public static class TestConfig extends SingleRouteCamelConfiguration {
        @Bean
        @Override
        public RouteBuilder route() {
            return new MyRoute();
        }
    }

    @Test
    public void testRoute() throws Exception {
        mockEndpoint.expectedBodiesReceived("Test Message");

        producerTemplate.sendBody("Test Message");

        mockEndpoint.assertIsSatisfied();
    }
}

我得到了这个例外:

  

org.apache.camel.component.direct.DirectConsumerNotAvailableException:   端点上没有可用的消费者:端点[direct:// out]。   交换[消息:测试消息]

看起来Mock没有从端点接收消息。

我做错了什么?

2 个答案:

答案 0 :(得分:1)

这个问题是因为,在您的路线配置中,没有" direct:out"消费者终点。

添加如下所示的一行,

from("direct:out").("Anything you want to log");

因此,直接:out将消耗交换,在您的测试中,mock将能够检查收到的文本而没有任何问题。希望这会有所帮助!!

答案 1 :(得分:1)

问题是模拟端点只是在委派给实际端点之前拦截了消息。引自the docs

  

重要提示:端点仍在运行中。不同的是什么   是注入Mock端点并首先接收消息   然后将消息委托给目标端点。你可以看到这个   作为一种拦截和代表或端点监听器。

您的问题的解决方案是告诉某些端点(在您的情况下期望消费者的端点)委托给实际端点。这可以使用@MockEndpointsAndSkip而不是@MockEndpoints轻松完成:

@RunWith(CamelSpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { MyRouteTest.TestConfig.class }, loader = CamelSpringDelegatingTestContextLoader.class)
@MockEndpointsAndSkip("direct:out") // <-- turns unit test from red to green ;)
public class MyRouteTest {
// ....
}