1. 概要

Apache Camel は、多くの既知の Enterprise IntegrationPatternsを実装する強力なオープンソース統合フレームワークです。

このチュートリアルでは、Camelルートの信頼性の高い自己完結型の単体テストを作成する方法を学習します。

まず、Spring Bootを使用して基本的なCamelアプリケーションを作成することから始めます。 次に、CamelのSpringテストサポートAPIを JUnit5で使用してアプリケーションをテストする方法を見ていきます。

2. 依存関係

プロジェクトがセットアップされ、がSpringBootおよびCamelで動作するように構成されていると仮定します。

次に、 camel-test- spring-junit5依存関係をpom.xmlに追加する必要があります。

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

名前が示すように、この依存関係は特に単体テスト用です。

3. シンプルなCamelSpringBootアプリケーションの定義

このチュートリアル全体を通して、テストの焦点は単純なApache CamelSpringBootアプリケーションになります。

それでは、アプリケーションのエントリポイントを定義することから始めましょう。

@SpringBootApplication
public class GreetingsFileSpringApplication {

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

ご覧のとおり、これは標準のSpringBootアプリケーションです。

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と呼ばれる直接エンドポイントからのメッセージを消費するようにルートを構成します。

それで、 メッセージ本文に文字列HelloBaeldungReadersを含めるように設定しました。 そして、ファイルコンポーネントを使用してメッセージ交換の内容をoutputというファイルディレクトリに書き込みます。

また、ルートにgreetings-routeというIDを付けます。 ルートで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();
    }
}

テストの重要な部分を見ていきましょう。

まず、テストクラスを3つの注釈で装飾することから始めます。

  • @SpringBootTest アノテーションは、テストがSpringアプリケーションコンテキストをブートストラップすることを保証します
  • また、 @CamelSpringBootRunner、を使用して、BootベースのテストにSpringベースのCamelテストサポートを提供します。
  • 最後に、 @MockEndpoints アノテーションを追加します。これは、モックを作成するエンドポイントをCamelに通知します。

次に、 ProducerTemplate オブジェクトを自動配線します。これは、メッセージ交換をエンドポイントに送信できるようにするインターフェイスです。

もう1つの重要なコンポーネントは、@EndpointInjectを使用して注入するMockEndpointです。 このアノテーションを使用して、ルートが開始するタイミングをCamelに通知し、モックエンドポイントを注入します。

すべてのテスト設定が整ったので、次の3つのステップで構成されるテストを作成できます。

  • まず、モックエンドポイントが指定されたメッセージ本文を受信するという期待を設定しましょう
  • 次に、テンプレートを使用して direct:startエンドポイントにメッセージを送信します。 ルートは着信メッセージ本文を操作しないため、null本文を送信することに注意してください
  • テストを終了するために、 assertIsSatisfiedメソッドを使用して、モックエンドポイントでの最初の期待が満たされていることを検証します

これにより、テストが正しく機能していることが確認されます。 素晴らしい! これで、Camelテストサポートユーティリティを使用して、自己完結型の独立した単体テストを作成する方法ができました。

6. 結論

この記事では、SpringBootでApacheCamelルートをテストする方法を学びました。 最初に、Spring Bootを使用して1つのルートで単純なCamelアプリケーションを作成する方法を学びました。

次に、Apache Camelの組み込みテストサポートプロジェクトで利用できる機能のいくつかを使用して、ルートをテストするための推奨されるアプローチについて学びました。

いつものように、記事の完全なソースコードは、GitHubから入手できます。