1. 概述

Apache Camel 是一个功能强大的开源集成框架,实现了众多已知的企业集成模式

在这个教程中,我们将学习如何为我们的Camel路由编写可靠、独立的单元测试。

首先,我们从创建一个基本的Camel应用程序开始,使用的是Spring Boot。然后,我们将了解如何使用Camel的Spring测试支持API与JUnit 5一起测试我们的应用。

2. 依赖项

假设我们的项目已经设置并配置好,可以与Spring Boot和Camel协同工作。

接下来,我们需要在pom.xml中添加*camel-test-spring-junit5*依赖:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-test-spring-junit5</artifactId>
    <version>4.3.0</version>
    <scope>test</scope>
</dependency>

正如名称所示,这个依赖是专为我们的单元测试设计的。

3. 定义简单的Camel Spring Boot应用

在整个教程中,我们的测试将关注一个简单的Apache Camel Spring Boot应用。

首先,让我们定义我们的应用入口点:

@SpringBootApplication
public class GreetingsFileSpringApplication {

    public static void main(String[] args) {
        SpringApplication.run(GreetingsFileSpringApplication.class, args);
    }
}

如我们所见,这是一款标准的Spring Boot应用。

3.1. 创建路由

接下来,我们将定义一个相当基础的路由:

@Component
public class GreetingsFileRouter extends RouteBuilder {

    @Override
    public void configure() throws Exception {
        
        from("direct:start")
          .routeId("greetings-route")
          .setBody(constant("Hello Baeldung Readers!"))
          .to("file:output");
    }
}

简单来说,Camel的路由是基本构建块,通常由一系列按顺序执行的步骤组成,由Camel消费并处理消息。

在我们的示例中,我们配置路由从名为start直接端点接收消息。

然后,我们将消息体设置为包含字符串Hello Baeldung Readers!,并将消息交换的内容使用文件组件写入名为output的文件夹。

我们还为路由赋予了一个ID,称为greetings-route。在路由中使用ID通常被视为良好实践,有助于我们在测试时定位到特定的路由。

3.2. 运行应用

本节结束时,如果我们运行应用并向直接消费者端点发送消息,我们应该能在输出目录中看到我们的问候文本。如果没有指定文件名,Camel会为我们创建一个:

$ cat output/D97099B6B2958D2-0000000000000000 
Hello Baeldung Readers!

4. 测试的一点思考

一般来说,编写干净的测试时,不应依赖可能无法控制或突然停止工作的外部服务或文件系统,这可能会影响测试结果。

我们也不想在路由代码中为单元测试特意编写代码。值得庆幸的是,Camel有一套专门用于测试的扩展和API。这可以看作是一种测试工具包,使得测试我们的Camel应用变得更加容易。

工具包通过向路由发送消息并检查消息是否按预期接收,简化了我们的测试过程。

5. 使用*@MockEndpoints*进行测试

考虑到上一节,我们现在开始编写第一个单元测试:

@SpringBootTest
@CamelSpringBootTest
@MockEndpoints("file:output")
class GreetingsFileRouterUnitTest {

    @Autowired
    private ProducerTemplate template;

    @EndpointInject("mock:file:output")
    private MockEndpoint mock;

    @Test
    void whenSendBody_thenGreetingReceivedSuccessfully() throws InterruptedException {
        mock.expectedBodiesReceived("Hello Baeldung Readers!");
        template.sendBody("direct:start", null);
        mock.assertIsSatisfied();
    }
}

让我们逐步解读测试的关键部分。

首先,我们在测试类上添加三个注解:

  • @SpringBootTest注解确保我们的测试启动Spring应用程序上下文。
  • 我们还使用了@CamelSpringBootRunner,它将Spring基础的Camel测试支持引入到基于Boot的测试中。
  • 最后,我们添加了@MockEndpoints注解,告诉Camel我们要为哪些端点创建模拟对象。

接下来,我们注入一个ProducerTemplate对象,这是一个接口,允许我们将消息交换发送到端点。

另一个关键组件是通过@EndpointInject注入的MockEndpoint使用此注解告诉Camel,在路由启动时,我们要注入我们的模拟端点。

现在我们的测试设置就绪了,我们可以编写测试,它包括三个步骤:

  • 首先,设定期望,模拟端点将收到给定的消息体。
  • 然后,我们使用模板向direct:start端点发送消息。请注意,我们将发送一个null体,因为我们的路由不会修改传入的消息体。
  • 最后,我们使用assertIsSatisfied方法验证对模拟端点的初始期望已被满足。

这证实了我们的测试正在正确工作。太棒了!现在我们有了使用Camel测试支持工具编写自包含、独立单元测试的方法。

6. 总结

在这篇文章中,我们学习了如何在Spring Boot中测试我们的Apache Camel路由。首先,我们了解了如何使用Spring Boot创建一个带有单个路由的基本Camel应用。

然后,我们了解了推荐的测试方法,利用了Apache Camel内置测试支持项目为我们提供的功能。

如往常一样,文章的完整源代码可以在GitHub上找到。


« 上一篇: MongoDB中的推送操作
» 下一篇: MongoDB中@DBRef指南