【问题标题】:Apache Camel Testing阿帕奇骆驼测试
【发布时间】:2011-12-19 17:09:07
【问题描述】:

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

在查看了一般的 Camel testing 文档和 Camel-Spring testing 文档之后,似乎单元测试骆驼端点的首选方法是通过 Spring 测试上下文框架使用对象的子类,例如AbstractJUnit38SpringContextTests 等等。

我对任何这些 API 的经验绝对为零。所以,虽然它们读起来很有趣,但我很难将它们放在上下文中(不是双关语)。

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

首先,什么时候适合使用MockEndpointDataSetTest

此外,Camel-Spring 文档(上面的链接)提供了以下示例:

@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,那么它上面的代码似乎从名为 mock:fooMockEndpoint 读取所有消息......但我不看看这些消息是从哪里来的(它们是如何到达端点的)!

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

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

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

【问题讨论】:

    标签: java unit-testing apache-camel spring-test


    【解决方案1】:

    彻底测试您的路线的出色实践。您提到的 Camel 测试和 Spring 测试资源可能是最好的起点。现在,是否使用 Spring 进行测试还取决于您设置路由的方式,即使用 Spring XML dsl 或 Java dsl。显然 CamelSpringTestSupport(甚至 AbstractJUnit38SpringContextTests)可能更适合前者,而对于后者,您可能更喜欢 CamelTestSupport。现在回答您的问题:

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

    2. 确定哪些端点要“存根”的标准做法是什么?通常可行的是就消息格式以及前后条件达成一致,即您可以测试生产者是否独立于消费者产生所需的消息,您甚至不必使用相同的协议(您可以发送例如上面提到的 MockEndpoint 的消息)。这将使您对制片人正在做正确的事情充满信心。同样,您也可以独立测试消费者。奇怪的是,当把所有东西放在一起时,一切都会奏效,如果没有,你的测试中可能会缺少一些东西。大多数情况下,并非所有内容都可以进行单元测试,最好进行与您的生产环境更相似的集成测试。

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

    【讨论】:

      【解决方案2】:

      Camel book中的测试章节很不错。我只是扩展 CamelTestSupport 并使用模拟的东西作为路由的虚拟输入或输出(我不担心 Spring 或注入东西等)。您还可以通过在路由上的组件之间放置一些东西(我忘记它们叫什么)来模拟故障等,来做很多奇特的事情。我强烈推荐上面的书,它非常清晰准确。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-09
        • 2013-02-09
        • 2018-11-27
        相关资源
        最近更新 更多