2011-12-19 172 views
2

我们使用Spring的DI和Camel进行路由/消息传递。我被要求为我们的各种组件设置一些(JUnit)单元测试(它们都以流水线方式将消息路由到彼此)。Apache Camel测试

采取甘德在一般Camel testing doc和Camel-Spring testing文档后,它似乎是单元测试骆驼端点的首选方法是使用像AbstractJUnit38SpringContextTests和各种对象的子类弹簧试验语境框架

我对这些API中的任何API都没有任何经验。所以,虽然他们为有趣的阅读做出了贡献,但是我很难将它们放到上下文中(没有双关语意思)。

因此有我挣扎了几个初步概念:

其一,什么时候适合使用MockEndpoint,VS DataSet,VS Test

此外,骆驼弹簧DOC(链接以上)提供了以下例子:

@ContextConfiguration 
public class MyCamelTest extends AbstractJUnit38SpringContextTests { 

    @Autowired 
    protected CamelContext camelContext; 

    @EndpointInject(uri = "mock:foo") 
    protected MockEndpoint foo; 

    public void testMocksAreValid() throws Exception { 

     // lets add more expectations... 
     MockEndpoint.assertIsSatisfied(camelContext); 

     // now lets do some further assertions 
     List<Exchange> list = foo.getReceivedExchanges(); 

     for (Exchange exchange : list) { 
      Message in = exchange.getIn(); 
      ... 
     }  
    } 
} 

如果我甚至开始了解该API的话,好像它上面的代码阅读MockEndpoint中名为mock:foo的所有消息...但我看不到这些消息来自哪里(他们如何到达端点首先)!

所以我的第二个问题是:确定哪些端点“存根”(模拟)的标准做法是什么?例如,如果同一个JMS消息队列被两个不同JAR/WAR内部的终端所利用:一个是制作者而另一个是消费者?在这种情况下,ProducerComponent(居于producer.war之内)是一个将消息推送到someQueue的骆驼端点。并且ConsumerComponent(居于consumer.war之内)是消费someQueue之外消息的另一个Camel端点。

如何组织这两个组件的单元测试?

预先感谢您在正确方向上的任何微调!

回答

3

Camel book中的测试章节非常好。我只是扩展了CamelTestSupport,我使用模拟的东西作为虚拟输入或输出到路由(我不担心Spring或注入事物等)。还有一些奇特的东西,你可以通过在一个路径上的组件之间放置东西(我忘记它们被称为)来模拟故障等。我强烈推荐上面这本书,它非常清晰和准确。

对于你的第二个问题,这取决于我想你的消息如何被创建。您可以使用模拟端点来提供或从队列中消耗(或两者)。模拟端点中有很多好的支持来检查消息。

CamelTestSupport及其超类有很多有用的创建消息的方法。

+0

谢谢弗朗西斯! – IAmYourFaja 2011-12-19 18:04:55

6

优秀的做法,彻底测试你的路线。您提到的骆驼测试和Spring测试资源可能是最好的起点。现在,使用Spring还是不用于测试也取决于您设置路由的方式,即使用Spring XML dsl或Java dsl。很明显,对于前者,CamelSpringTestSupport(或者甚至AbstractJUnit38SpringContextTests)可能更合适,对于后者,您可能更喜欢CamelTestSupport。现在您的问题:

  1. 什么时候适合使用MockEndpoint,vs DataSet,vs Test? 这不是“真正的对比”,它们都服务于不同的角色,并根据需要将它们一起使用。测试不是骆驼特定的,它只是常规的JUnit测试。骆驼提供一些专业化和实用工具来简化测试(CamelTestSupport等)。通常(并非总是),您可以使用Camel进行系统集成,这与轻量级业务流程或工作流程类似,充分利用了Camel定义的强大EIP(企业集成模式)以及对无数协议和数据格式的支持。在测试过程中,您可能会向某个端点发送消息,但是如何确保您的处理正确并且收到的消息是预期的?为此,Camel提供了MockEndpoint,您可以(应该在测试过程中)将其用作目标端点的替代品。这样,您可以使用断言来确保收到的消息是您期望的消息,按照正确的顺序,时序等。查看properties component,了解在不同测试(或生产)环境中替代端点的便捷方式。 DataSet是发射或验证一系列消息的便捷方式。

  2. 确定哪些端点“存根”的标准做法是什么?通常起作用的是就消息格式和前置条件和后置条件达成一致,也就是说,您可以测试生产者是否独立于消费者生成所需的消息,而且您甚至不必使用相同的协议(可以发送例如上面提到的消息到MockEndpoint)。这会让你对制片人做正确的事情有很高的信心。同样,您也可以独立测试消费者。可能性是,如果放在一起,一切都会起作用,否则测试中可能会丢失一些东西。大多数情况下,并非所有情况都可以通过单元测试,并且集成测试与您的生产环境更相似,这是一个很好的做法。

如果您有更具体的问题,我可以给你更具体的建议。我希望这有帮助。