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上找到。