Apache Camel测试

IAm*_*aja 4 java unit-testing apache-camel spring-test

我们使用Spring for DI和Camel进行路由/消息传递.我被要求为我们的各种组件设置一些(JUnit)单元测试(所有组件都以管道方式将消息路由到另一个组件).

在对一般的Camel测试文档和Camel-Spring测试文档进行了研究之后,看起来单元测试camel端点的首选方法是通过Spring Test Context Framework使用对象的子类AbstractJUnit38SpringContextTests和类型.

我绝对没有任何这些API的经验.所以,虽然他们有趣的阅读,但我很难把它们放到上下文中(没有双关语).

因此,我正在努力解决一些初步概念:

首先,何时使用a MockEndpoint,vs DataSet,vs Test

此外,Camel-Spring 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();
            ...
        }       
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我甚至开始理解这个API,那么它上面的代码似乎正在读取来自MockEndpoint命名的所有消息mock:foo...但我不知道这些消息来自何处(它们如何到达端点)第一名)!

所以我的第二个问题是:确定哪些端点为"stub"(模拟)的标准做法什么?例如,如果生活在两个不同JAR/WAR中的两个端点使用相同的JMS消息队列,那么:一个是生产者而另一个是消费者?在这种情况下,ProducerComponent(生活在内部producer.war)是一个将消息推送到的Camel端点someQueue.而且ConsumerComponent(生活在里面consumer.war)是消费消息的另一个Camel端点someQueue.

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

提前感谢任何正确方向的推动!

小智 6

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

  1. 何时适合使用MockEndpoint,vs DataSet,vs?它并非真正"对抗",它们都扮演不同的角色,您可以根据需要一起使用它们.测试不是Camel特有的,它只是常规的JUnit测试.Camel提供了一些特殊化和实用程序来简化测试(CamelTestSupport等).通常(并非总是),您可以使用Camel进行系统集成,轻量级业务流程或工作流等,利用Camel定义的强大EIP(企业集成模式)以及对无数协议和数据格式的支持.在测试期间,您可以向某个端点发送消息,但是如何确保您的处理正确并且收到的消息是预期的消息?为此,Camel提供了MockEndpoint,您可以(应该在测试期间)用作目标端点的替代品.通过这种方式,您可以使用断言来确保收到的消息是您所期望的消息,正确的顺序,时间等.查看属性组件,以便在不同的测试(或生产)环境中替换端点的便捷方式.DataSet是一种触发或验证一系列消息的便捷方式.

  2. 确定哪些端点为"存根"的标准做法是什么?通常的工作方式是同意消息格式以及前后条件,即您可以测试生产者是否独立于消费者生成所需的消息,您甚至不必使用相同的协议(您可以发送例如,如上所述的消息,如MockEndpoint).这会让你对制片人做正确的事情充满信心.同样,您也可以独立测试消费者.可能的情况是,当放在一起时一切都会起作用,如果没有,你的测试中可能会遗漏一些东西.大多数情况下,并非所有东西都可以进行单元测试,并且拥有与您的生产环境更相似的集成测试是一种很好的做法.

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