2014-12-02 185 views
1

我最近开始调查Apache骆驼,我有一个问题。 我开始编写一些测试我的路线,也有很多的例子,其中“为”路线的一部分作为阿帕奇骆驼模拟端点

<route id="person-add-route"> 
     <from uri="direct:start"/> 
     <to uri="mock:result"/> 
    </route> 

所以,我写了一个测试,我在哪里exepcting有模拟写:结果作为最后的结果。

@Test 
@DirtiesContext 
public void testCamel() throws Exception { 
    // Given 
    Object body = "body"; 
    int messageCount = 1; 
    MockEndpoint endpoint = getMockEndpoint("mock:result"); 

    // When 
    template.sendBody("direct:start", body); 

    // Then 
    endpoint.expectedMessageCount(messageCount); 
    endpoint.assertIsSatisfied(); 
} 

这里的问题:这是很重要的写模拟:导致如果我想测试我的路线?

+0

不知道你在问什么......你是问你是否需要在所有路线的末端包含一个模拟终点以测试它们? – mdnghtblue 2014-12-02 16:32:45

+0

我在问 - 我是否需要在生产线中包含“模拟:结果”?如果是的话,这对我来说很困惑,因为我不明白为什么我需要在真实代码中添加测试功能?有什么办法,我可以在我的真实代码中排除“mock:”指令吗? 这对我来说不是一个问题,但我希望得到一些更优雅的解决方案。 谢谢, – 2014-12-02 18:17:27

+0

你做错了,你应该在发送消息之前设置期望值。 1)设置预期2)发送消息3)断言已满意 – 2014-12-03 14:29:20

回答

4

您不需要在生产中包含“模拟:结果”,有多种方法可以测试您的路线。一个是在你的骆驼测试实施isMockEndpoints

@Override 
public boolean isMockEndpoints() 
{ 
    return "*"; 
} 

所以,如果您的路线是这样的:

<route id="person-add-route"> 
    <from uri="direct:start"/> 
    <to uri="direct:result"/> 
</route> 

您可以检查MockEndpoint这样的:

MockEndpoint endpoint = getMockEndpoint("mock:direct:result"); 

你也可以请使用AdviceWith在测试时修改您的路线,方法如下:

context.getRouteDefinitions().get(0).adviceWith(context, new AdviceWithRouteBuilder() { 
    @Override 
    public void configure() throws Exception 
    { 
     weaveAddLast().to("mock:result"); 
    } 
}); 

另外,正如克劳斯在他的评论中提到的那样,确保在将消息发送到路由之前设置您的期望。

+0

谢谢,好方法。 – 2014-12-02 22:08:32

+0

你能推荐一些资源来学习apache骆驼吗?) – 2014-12-02 22:12:49

+0

嗨,实际上,我试过你的解决方案,它不工作,我收到DirectConsumerNotAvailableException - 终端上没有消费者可用。 – 2014-12-03 08:36:57