知識庫 / Spring / Spring Boot RSS 訂閱

Spring Boot 中 Apache Camel 路由測試

Spring Boot,Testing
HongKong
7
12:16 PM · Dec 06 ,2025

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 內置測試支持項目提供的某些功能,對我們的路由採用推薦的方法。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.