4

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

在查看了通用的Camel 测试文档和Camel-Spring 测试文档之后,似乎单元测试骆驼端点的首选方法是通过Spring Test Context Framework使用对象的子类等AbstractJUnit38SpringContextTests

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

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

一方面,什么时候适合使用 a MockEndpoint, vs DataSet, vs Test

此外,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,那么它上面的代码似乎从一个MockEndpoint命名的读取所有消息mock:foo......但我看不到这些消息来自哪里(它们如何到达端点第一名)!

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

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

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

4

2 回答 2

6

彻底测试您的路线的绝佳实践。您提到的 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 组件,用于在不同的测试(或生产)环境中替换端点的便捷方式。DataSet 是触发或验证一系列消息的便捷方式。

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

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

于 2011-12-20T01:53:50.150 回答
3

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

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

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

于 2011-12-19T17:23:03.883 回答