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 ルートを起動します。
以下に例を示します。
サンプル実装は Camel Quarkus ソースにあります。
1.4.2. ネイティブモードでの実行 リンクのコピーリンクがクリップボードにコピーされました!
サポートされているすべてのエクステンションについて、アプリケーションがネイティブモードで動作することを常にテストしてください。
それぞれの JVM モードクラスからロジックを継承することにより、JVM モード用に定義されたテストロジックを再利用できます。
@QuarkusIntegrationTest
アノテーションを追加して、Quarkus JUnit エクステンションに、テスト対象のアプリケーションをネイティブイメージにコンパイルし、テストを実行する前にイメージを起動するように指示します。
サンプル実装は 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
ファイルの設定よりも優先されます。
@QuarkusTestResource
を使用して、テストクラスから定義済みのテストリソースを参照します。
サンプル実装は Camel Quarkus ソースにあります。
1.4.4.2. WireMock リンクのコピーリンクがクリップボードにコピーされました!
ライブエンドポイントが利用できない、信頼性が低い、コストがかかる場合などには、テストをライブエンドポイントに接続する代わりに、サードパーティーのサービスおよび API との HTTP インタラクションをスタブできます。
WireMock を使用すると、HTTP インタラクションをモックおよび記録できます。これは、さまざまなコンポーネントエクステンション用に Camel Quarkus テストスイート全体で広く使用されています。
1.4.4.2.1. WireMock のセットアップ リンクのコピーリンクがクリップボードにコピーされました!
手順
WireMock サーバーをセットアップします。
注記WireMock プロキシーを介して HTTP インタラクションを渡すように、テスト対象の Camel コンポーネントを設定することが重要です。これは、API エンドポイント URL を決定するコンポーネントプロパティーを設定することで実現できます。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注記場合によっては、物事が単純ではなく、API クライアントライブラリーを設定するために追加の作業が必要になることがあります。たとえば、Twilio の場合です。
-
テストクラスに
@QuarkusTestResource
アノテーションがあり、適切なテストリソースクラスが値として指定されていることを確認します。
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>
<dependency>
<groupId>org.apache.camel.quarkus</groupId>
<artifactId>camel-quarkus-junit5</artifactId>
<scope>test</scope>
</dependency>
次のように、テストで CamelQuarkusTestSupport
を使用できます。
@QuarkusTest @TestProfile(SimpleTest.class) //necessary only if "newly created" context is required for the test (worse performance) public class SimpleTest extends CamelQuarkusTestSupport { ... }
@QuarkusTest
@TestProfile(SimpleTest.class) //necessary only if "newly created" context is required for the test (worse performance)
public class SimpleTest extends CamelQuarkusTestSupport {
...
}
1.4.5.2. CamelQuarkusTestSupport 使用時の制限 リンクのコピーリンクがクリップボードにコピーされました!
CamelQuarkusTestSupport を使用する場合、いくつかの制限があります。
1.4.5.2.1. メソッド リンクのコピーリンクがクリップボードにコピーされました!
一部のメソッドは実行されません。代わりに do
で始まる新しいメソッドを使用します。
実行されないメソッド | 代わりに使用 |
---|---|
|
|
|
|
|
|
|
|
|
|
@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 コールバックとアノテーションは機能しない可能性があります。
コールバック | アノテーション |
---|---|
|
|
|
|
|
|
|
|
| |
|
詳細は、Enrichment via QuarkusTest*Callback ドキュメント を参照してください。
1.4.5.2.7. adviceWith の使用 リンクのコピーリンクがクリップボードにコピーされました!
adviceWith
が true に設定されている場合、推奨されていないルートはすべて起動されません。これらのルートを起動するには、メソッド CamelQuarkusTestSupport.startRouteDefinitions()
を実行する必要があります。
1.4.5.2.8. @Produces の使用 リンクのコピーリンクがクリップボードにコピーされました!
@Produces
は、オーバーライドされたメソッド createRouteBuilder()
とともに使用します。@Produces
と RouteBuilder()
を組み合わせると、正しく動作しない場合があります。
1.4.5.2.9. ルートの設定 リンクのコピーリンクがクリップボードにコピーされました!
追加および除外するアプリケーションからのルート (src/main/java
) を設定するには、以下を使用できます。
-
quarkus.camel.routes-discovery.exclude-patterns
-
quarkus.camel.routes-discovery.include-patterns
詳細は、Core ドキュメント を参照してください。