1.4. Camel Quarkus エクステンションのテスト


テストは、Camel ルートが長期にわたって期待どおりに動作することを確認するための良い方法です。まだお読みでない場合は、Camel Quarkus ユーザーガイドの First Steps と Quarkus ドキュメントの Testing your application セクションをお読みください。

Quarkus でルートをテストする最も簡単な方法は、ローカル統合テストを作成することです。これには、JVM モードとネイティブモードの両方をカバーできるという利点があります。

JVM モードでは、CamelTestSupport スタイルのテスト を使用できます。

1.4.1. JVM モードでの実行

JVM モードでは、@QuarkusTest アノテーションを使用して Quarkus をブートストラップし、@Test ロジックが実行される に Camel ルートを起動します。

以下に例を示します。

import io.quarkus.test.junit.QuarkusTest;
import org.junit.jupiter.api.Test;

@QuarkusTest
class MyTest {
    @Test
    public void test() {
        // Use any suitable code that sends test data to the route and then assert outcomes
        ...
    }
}
Copy to Clipboard Toggle word wrap
ヒント

サンプル実装は Camel Quarkus ソースにあります。

1.4.2. ネイティブモードでの実行

注記

サポートされているすべてのエクステンションについて、アプリケーションがネイティブモードで動作することを常にテストしてください。

それぞれの JVM モードクラスからロジックを継承することにより、JVM モード用に定義されたテストロジックを再利用できます。

@QuarkusIntegrationTest アノテーションを追加して、Quarkus JUnit エクステンションに、テスト対象のアプリケーションをネイティブイメージにコンパイルし、テストを実行する前にイメージを起動するように指示します。

import io.quarkus.test.junit.QuarkusIntegrationTest;

@QuarkusIntegrationTest
class MyIT extends MyTest {
   ...
}
Copy to Clipboard Toggle word wrap
ヒント

サンプル実装は Camel Quarkus ソースにあります。

1.4.3. @QuarkusTest と @QuarkusIntegrationTest の違い

ネイティブ実行可能ファイルは、バイトコードではなくネイティブコードであるため、実行に JVM を必要とせず、また JVM で実行することもできません。

従来の JVM を使用して実行するために、テストをネイティブコードにコンパイルしても意味はありません。

そのため、テストとアプリケーション間の通信は、ネットワーク (HTTP/REST、またはアプリケーションが使用するその他のプロトコル)、ファイルシステム (ログファイルなど) の監視、またはその他のプロセス間通信を介して行う必要があります。

1.4.3.1. JVM モードでの @QuarkusTest

JVM モードでは、@QuarkusTest のアノテーションが付けられたテストは、テスト対象のアプリケーションと同じ JVM で実行されます。

これは、@Inject を使用して、アプリケーションからテストコードに Bean を追加できることを意味します。

@javax.enterprise.inject.Alternative および @javax.annotation.Priority を使用して、新しい Bean を定義したり、アプリケーションから Bean をオーバーライドしたりすることもできます。

1.4.3.2. ネイティブモードでの @QuarkusIntegrationTest

ネイティブモードでは、@QuarkusIntegrationTest のアノテーションが付けられたテストは、実行中のネイティブアプリケーションとは別のプロセスでホストされている JVM で実行されます。

QuarkusIntegrationTest は、@QuarkusTest では利用できない追加機能を提供します。

  • JVM モードでは、Quarkus ビルドによって生成された実行可能なアプリケーション JAR を起動してテストできます。
  • ネイティブモードでは、Quarkus ビルドによって作成されたネイティブアプリケーションを起動してテストできます。
  • コンテナーイメージをビルドに追加すると、コンテナーが起動し、それに対してテストが実行されます。

QuarkusIntegrationTest の詳細は、Quarkus testing guide を参照してください。

1.4.4. 外部サービスによるテスト

1.4.4.1. Testcontainers

アプリケーションは、メッセージングブローカー、データベース、その他のサービスなどの外部リソースにアクセスする必要がある場合があります。

対象のサービスのコンテナーイメージが利用可能な場合は、Testcontainers を使用して、テスト中にサービスを起動および設定できます。

1.4.4.1.1. QuarkusTestResourceLifecycleManager を使用して設定データを渡す

アプリケーションを正常に動作させるためには、多くの場合、接続設定データ (ホスト、ポート、ユーザー、リモートサービスのパスワード) をアプリケーションの起動前に渡すことが不可欠です。

Quarkus エコシステムでは、QuarkusTestResourceLifecycleManager がこの目的を果たします。

start() メソッドで 1 つ以上の Testcontainer を起動し、メソッドから接続設定を Map の形式で返すことができます。

このマップのエントリーは、モードに応じてさまざまな方法でアプリケーションに渡されます。

  • ネイティブモード: コマンドライン (-Dkey=value)
  • JVM モード: 特別な MicroProfile 設定プロバイダー
注記

これらの設定は、application.properties ファイルの設定よりも優先されます。

import java.util.Map;
import java.util.HashMap;

import io.quarkus.test.common.QuarkusTestResourceLifecycleManager;
import org.testcontainers.containers.GenericContainer;
import org.testcontainers.containers.wait.strategy.Wait;

public class MyTestResource implements QuarkusTestResourceLifecycleManager {

    private GenericContainer myContainer;

    @Override
    public Map<String, String> start() {
        // Start the needed container(s)
        myContainer = new GenericContainer(...)
                .withExposedPorts(1234)
                .waitingFor(Wait.forListeningPort());

        myContainer.start();

        // Pass the configuration to the application under test
        return new HashMap<>() {{
                put("my-container.host", container.getContainerIpAddress());
                put("my-container.port", "" + container.getMappedPort(1234));
        }};
    }

    @Override
    public void stop() {
        // Stop the needed container(s)
        myContainer.stop();
        ...
    }
Copy to Clipboard Toggle word wrap

@QuarkusTestResource を使用して、テストクラスから定義済みのテストリソースを参照します。

import io.quarkus.test.common.QuarkusTestResource;
import io.quarkus.test.junit.QuarkusTest;

@QuarkusTest
@QuarkusTestResource(MyTestResource.class)
class MyTest {
   ...
}
Copy to Clipboard Toggle word wrap
ヒント

サンプル実装は Camel Quarkus ソースにあります。

1.4.4.2. WireMock

ライブエンドポイントが利用できない、信頼性が低い、コストがかかる場合などには、テストをライブエンドポイントに接続する代わりに、サードパーティーのサービスおよび API との HTTP インタラクションをスタブできます。

WireMock を使用すると、HTTP インタラクションをモックおよび記録できます。これは、さまざまなコンポーネントエクステンション用に Camel Quarkus テストスイート全体で広く使用されています。

1.4.4.2.1. WireMock のセットアップ

手順

  1. WireMock サーバーをセットアップします。

    注記

    WireMock プロキシーを介して HTTP インタラクションを渡すように、テスト対象の Camel コンポーネントを設定することが重要です。これは、API エンドポイント URL を決定するコンポーネントプロパティーを設定することで実現できます。

    import static com.github.tomakehurst.wiremock.client.WireMock.aResponse;
    import static com.github.tomakehurst.wiremock.client.WireMock.get;
    import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo;
    import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig;
    
    import java.util.HashMap;
    import java.util.Map;
    
    import com.github.tomakehurst.wiremock.WireMockServer;
    
    import io.quarkus.test.common.QuarkusTestResourceLifecycleManager;
    
    public class WireMockTestResource implements QuarkusTestResourceLifecycleManager {
    
        private WireMockServer server;
    
        @Override
        public Map<String, String> start() {
            // Setup & start the server
            server = new WireMockServer(
                wireMockConfig().dynamicPort()
            );
            server.start();
    
            // Stub a HTTP endpoint. Note that WireMock also supports a record and playback mode
            // http://wiremock.org/docs/record-playback/
            server.stubFor(
                get(urlEqualTo("/api/greeting"))
                    .willReturn(aResponse()
                        .withHeader("Content-Type", "application/json")
                        .withBody("{\"message\": \"Hello World\"}")));
    
            // Ensure the camel component API client passes requests through the WireMock proxy
            Map<String, String> conf = new HashMap<>();
            conf.put("camel.component.foo.server-url", server.baseUrl());
            return conf;
        }
    
        @Override
        public void stop() {
            if (server != null) {
                server.stop();
            }
        }
    }
    Copy to Clipboard Toggle word wrap
    注記

    場合によっては、物事が単純ではなく、API クライアントライブラリーを設定するために追加の作業が必要になることがあります。たとえば、Twilio の場合です。

  2. テストクラスに @QuarkusTestResource アノテーションがあり、適切なテストリソースクラスが値として指定されていることを確認します。
import io.quarkus.test.common.QuarkusTestResource;
import io.quarkus.test.junit.QuarkusTest;

@QuarkusTest
@QuarkusTestResource(WireMockTestResource.class)
class MyTest {
   ...
}
Copy to Clipboard Toggle word wrap

WireMock サーバーは、すべてのテストが実行される前に起動し、すべてのテストが終了するとシャットダウンします。

ヒント

サンプルの実装は、Camel Quarkus 統合テストソースツリーにあります。

1.4.5. CamelQuarkusTestSupport の使用

Camel Quarkus 2.13.0 以降、CamelQuarkusTestSupport をテストに使用できます。これは CamelTestSupport の後継です。

注記

これは JVM モードでのみ機能します。

1.4.5.1. JVM モードでの CamelQuarkusTestSupport によるテスト

次の依存関係をモジュール (できれば test スコープ内) に追加します。

<dependency>
    <groupId>org.apache.camel.quarkus</groupId>
    <artifactId>camel-quarkus-junit5</artifactId>
    <scope>test</scope>
</dependency>
Copy to Clipboard Toggle word wrap

次のように、テストで CamelQuarkusTestSupport を使用できます。

@QuarkusTest
@TestProfile(SimpleTest.class) //necessary only if "newly created" context is required for the test (worse performance)
public class SimpleTest extends CamelQuarkusTestSupport {
    ...
}
Copy to Clipboard Toggle word wrap

1.4.5.2. CamelQuarkusTestSupport 使用時の制限

CamelQuarkusTestSupport を使用する場合、いくつかの制限があります。

1.4.5.2.1. メソッド

一部のメソッドは実行されません。代わりに do で始まる新しいメソッドを使用します。

Expand
実行されないメソッド代わりに使用

afterAll

doAfterAll

afterEach

doAfterEach

afterTestExecution

doAfterTestExecution

beforeAll

doBeforeAll

beforeEach

doBeforeEach

注記

@TestInstance(TestInstance.Lifecycle.PER_METHOD) を使用する場合、doAfterConstruct は各テストの前のコールバックを意味します。これは beforeAll とは異なります。

1.4.5.2.2. アノテーション

@io.quarkus.test.junit.QuarkusTest でテストクラスにアノテーションを付け、org.apache.camel.quarkus.test.CamelQuarkusTestSupport を拡張する必要があります。

1.4.5.2.3. 起動と停止
  • 1 つのアプリケーションのライフサイクル内で同じ CamelContext インスタンスを停止して再起動することはできません。CamelContext.stop() を呼び出すことはできますが、CamelContext.start() は機能しません。
  • CamelContext は、通常、テスト時にもアプリケーションの起動と停止にバインドされます。
  • テスト対象のアプリケーションは、指定された Maven/Gradle モジュールのすべてのテストクラスに対して 1 回起動されます。Quarkus JUnit エクステンションは、アプリケーションの起動と停止を制御します。アプリケーションの停止は、明示的に指示する必要があります。
1.4.5.2.4. アプリケーションの再起動

Quarkus JUnit エクステンションに特定のテストクラスのアプリケーションと CamelContext を強制的に再起動させるには、そのクラスに一意の @io.quarkus.test.junit.TestProfile を割り当てる必要があります。

手順については、Quarkus ドキュメントの testing different profiles を参照してください。

同様の効果を得るために、@io.quarkus.test.common.QuarkusTestResource も使用できます。

1.4.5.2.5. Bean の生成

Camel Quarkus は、ビルド段階で Bean の生成を実行します。テストが一緒にビルドされるため、除外動作が CamelQuarkusTestSupport に実装されます。特定のタイプと名前のプロデューサーが 1 つのテストで使用される場合には、残りのテストでも、同じインスタンスが使用されます。

1.4.5.2.6. JUnit Jupiter コールバックが機能しない可能性がある

以下の JUnit Jupiter コールバックとアノテーションは機能しない可能性があります。

Expand
コールバックアノテーション

BeforeEachCallback

@BeforeEach

AfterEachCallback

@AfterEach

AfterAllCallback

@AfterAll

BeforeAllCallback

@BeforeAll

BeforeTestExecutionCallback

 

AfterTestExecutionCallback

 

詳細は、Enrichment via QuarkusTest*Callback ドキュメント を参照してください。

1.4.5.2.7. adviceWith の使用

adviceWith が true に設定されている場合、推奨されていないルートはすべて起動されません。これらのルートを起動するには、メソッド CamelQuarkusTestSupport.startRouteDefinitions() を実行する必要があります。

1.4.5.2.8. @Produces の使用

@Produces は、オーバーライドされたメソッド createRouteBuilder() とともに使用します。@ProducesRouteBuilder() を組み合わせると、正しく動作しない場合があります。

1.4.5.2.9. ルートの設定

追加および除外するアプリケーションからのルート (src/main/java) を設定するには、以下を使用できます。

  • quarkus.camel.routes-discovery.exclude-patterns
  • quarkus.camel.routes-discovery.include-patterns

詳細は、Core ドキュメント を参照してください。

トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2025 Red Hat