我有以下路线配置:
@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没有从端点接收消息。
我做错了什么?
答案 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 {
// ....
}