テストイベントメッセージの配信
Test.stopTest() の後でテストイベントメッセージを配信
Apex テストでプラットフォームイベントメッセージを公開するには、publish ステートメントを Test.startTest() ステートメントと Test.stopTest() ステートメントで囲みます。EventBus.publish() メソッドを Test.startTest() ステートメントと Test.stopTest() ステートメントの間でコールします。テストコンテキストでは、EventBus.publish() メソッドは公開操作をキューに追加します。Test.stopTest() ステートメントは、イベントの公開を実行し、イベントメッセージをテストイベントバスに配信します。Test.stopTest() ステートメントの後に検証を含めます。たとえば、登録された Apex トリガまたは登録されたフローの一時停止要素によって、Salesforce レコードの作成など、期待されるアクションが実行されたかどうかを検証できます。
例
次のサンプルテストクラスには 2 つのテストメソッドが含まれます。testValidEvent() メソッドは、イベントの公開が成功し、関連付けられたトリガが起動されたかどうかを確認します。testInvalidEvent() メソッドは、必須項目の欠落したイベントの公開が失敗してトリガが起動されないことを検証します。testValidEvent() メソッドは、1 つの Low_Ink__e イベントを作成します。Test.stopTest() の後、これは SOQL クエリを実行し、ケースレコードが作成されること、つまりトリガが起動されたことを検証します。2 番目のテストメソッドは同様のプロセスに従いますが、無効なテストを目的とします。
この例では、組織で Low_Ink__e イベントおよび関連付けられたトリガが定義されている必要があります。
必要に応じて Test.getEventBus().deliver() を使用してテストイベントメッセージを配信
Test.getEventBus().deliver() をコールすることで、サブスクライバーにテストイベントメッセージを配信するタイミングを制御できます。Test.getEventBus().deliver() を使用してテストイベントメッセージを複数回配信し、サブスクライバーが各ステップでテストイベントを処理したことを検証します。イベントメッセージを複数回配信することは、イベントの連続的な処理をテストする場合に役立ちます。たとえば、同じテスト内のループでサブスクライバーの連続アクションを検証できます。
Test.getEventBus().deliver() を Test.startTest() と Test.stopTest() のステートメントブロックで囲みます。
また、Test.startTest() や Test.stopTest() のステートメントブロックの外にある Apex テストメソッドで、Test.getEventBus().deliver() を呼び出すことができます。これにより、非同期 Apex でイベントメッセージをテストできます。
非同期 Apex から公開されたテストイベントメッセージの配信
失敗時に BatchApexErrorEvent を公開する一括処理 Apex ジョブをテストする場合は、Test.startTest() および Test.stopTest() のステートメントブロックで Test.getEventBus().deliver() を使用します。Test.stopTest() のコールにより、このステートメントの後に非同期の Apex ジョブを実行できます。次に、Test.getEventBus().deliver() によって、失敗した一括処理ジョブが公開したイベントメッセージを配信できます。
このスニペットは、Apex の一括処理ジョブを実行し、イベントメッセージを配信する方法を示しています。これは Test.stopTest() の後で一括処理ジョブを実行します。この一括処理ジョブは、Database.RaisesPlatformEvents の実装により、失敗が発生すると BatchApexErrorEvent メッセージを公開します。Test.stopTest() が実行された後に、別の Test.getEventBus().deliver() ステートメントが追加され、BatchApexErrorEvent を配信できるようになります。
非同期 Apex では、キュー可能 Apex や future メソッドも使用できます。この非同期 Apex ジョブ内からプラットフォームイベントメッセージを公開する場合、非同期 Apex ジョブは Test.stopTest() の後に実行します。Test.getEventBus().deliver(); を追加する必要はありません。次の例では、キュー可能 Apex ジョブで公開するプラットフォームイベントメッセージの配信方法を示しています。Test.stopTest() の後、キュー可能ジョブが実行され、イベントメッセージが配信されます。
例: イベントメッセージの個別配信
このテストクラスは Order_Event__e イベントメッセージを公開し、Test.getEventBus().deliver() を使用してそのイベントメッセージを配信します。また、トリガでイベントメッセージが処理されてタスクが作成されたことを検証します。重複するイベントメッセージ (同じ Event_ID__c カスタム項目値を持つイベント) が公開され、配信されます。このテストでは、トリガで重複イベントのタスクが作成されなかったことを検証します。
このテストクラスを実行する前に、Order_Event__e という名前のプラットフォームイベントと、Text 型の Event_ID__c 項目、Text 型の Order_Number__c 項目、Checkbox 型の Has_Shipped__c 項目を定義します。
この例のトリガは、テストクラスで公開する Order_Event__e イベントメッセージを処理します。
Apex 公開コールバックのテストのためにイベントメッセージの公開を失敗させる
Apex 公開コールバックには、非同期の EventBus.publish コールの最終結果が含まれています。Apex 公開コールバッククラスをテストするため、Test.getEventBus().fail() を使用して、公開コールの失敗をシミュレートします。
Apex テストでは、イベントメッセージがテストイベントバスで同期的に公開されます。テストでコールバックメソッドの実行をシミュレートするため、イベントメッセージを配信したり、イベントメッセージの公開を失敗させたりします。このセクションでは、イベント公開の失敗について説明します。
Test.getEventBus().fail() メソッドを使用すると、コールの直後にイベントの公開が失敗し、イベントメッセージがテストイベントバスから削除されます。このメソッドでは、コールバッククラスの onFailure() メソッドが呼び出されます。イベントメッセージを公開できない場合は、プラットフォームイベントで定義されているどのトリガも、失敗したイベントを受信しません。
次に示すクラスの例は、「Apex 公開コールバックを使用した非同期プラットフォームイベント公開の結果の取得」に示されている FailureAndSuccessCallback クラスのテストクラスです。このテストクラスは、テストイベントメッセージをテストイベントバスで配信するときの失敗をテストする方法を示しています。このテストクラスを実行する前に、[設定] で表示ラベルの Order Event と Order Number の Text 項目を指定して、プラットフォームイベントを定義します。
イベントメッセージを正常に配信するには、次のセクションを確認してください。