1. 概述
Apache Camel 是一個強大的開源集成框架,它實現了許多已知的企業集成模式。
在本教程中,我們將學習如何編寫可靠、自包含的單元測試,用於我們的 Camel 路由
首先,我們將通過使用 Spring Boot 創建一個基本的 Camel 應用程序。然後,我們將研究如何使用 Camel 的 Spring 測試支持 API 與 JUnit 5 測試我們的應用程序。
2. 依賴項
假設我們的項目已設置並配置為與 Spring Boot 和 Camel 配合使用。然後,我們需要將 camel-test-spring-junit5 依賴項添加到我們的 pom.xml 中:
<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 應用程序
在整個教程中,我們的測試將集中在一個簡單的 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");
}
}為了快速回顧,Apache 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,為基於 Boot 的測試提供 Spring 模式下的 Camel 測試支持
- @MockEndpoints 註解最終告訴 Camel 我們想要為哪些端點創建 Mock
接下來,我們自動注入一個ProducerTemplate 對象,這是一個接口,允許我們向端點發送消息交換。
另一個關鍵組件是MockEndpoint,我們使用@EndpointInject 註解注入。使用此註解告訴 Camel 當路由開始時,我們想要注入我們的 Mock 端點。
現在我們已經設置了所有測試配置,我們可以編寫測試,該測試包含三個步驟:
- 首先,讓我們設置一個期望,即我們的 Mock 端點將接收給定的消息主體
- 然後,我們將使用模板向我們的direct:start 端點發送一條消息。請注意,我們將使用null 作為消息主體,因為我們的路由不會修改傳入的消息主體
- 要總結我們的測試,我們使用 assertIsSatisfied 方法來驗證我們在 Mock 端點上的初始期望是否已滿足
這確認我們的測試正在正確運行。太棒了!我們現在擁有使用 Camel 測試支持工具編寫自包含、獨立的單元測試的方法。
6. 結論
在本文中,我們學習瞭如何使用 Spring Boot 測試我們的 Apache Camel 路由。首先,我們學習瞭如何使用 Spring Boot 創建一個簡單的 Camel 應用程序,其中包含一個路由。
然後,我們學習了使用 Apache Camel 內置測試支持項目提供的某些功能,對我們的路由採用推薦的方法。