再試行されたイベントメッセージのテスト
Apex トリガで EventBus.RetryableException を発生させることで、イベントメッセージの処理を再試行できます。API バージョン 43.0 以降では、Test.EventBus.deliver() をコールして EventBusSubscriber 項目を調べることで、再試行されたイベントメッセージをテストできます。
Apex テストで再試行されたイベントメッセージを強制的に再配信するには、Test.EventBus.deliver() をコールします。このメソッドでは、最後の deliver() コール以降に公開された他のイベントメッセージも配信されます。
API バージョン 43.0 以降では、次の新しい EventBusSubscriber 項目を確認して、再試行されたトリガをテストできます。
- 再試行回数
- LastError
EventBusSubscriber.Retries 項目は、トリガが再試行された回数を示します。
EventBusSubscriber.LastError は、最後に実行された throw ステートメントに渡されたエラーメッセージを示します (throw new EventBus.RetryableException('Error Message'))。
例
このテストメソッドは、トリガを起動するテストイベントメッセージを配信します。関連付けられたイベントトリガで EventBus.RetryableException を 2 回発生させます。テストでは、EventBusSubscriber を照会して Retries 項目値を確認することで、トリガが 2 回再試行されたことを検証します。
このテストクラスを実行する前に、Order_Event__e という名前のプラットフォームイベントと、Text 型の Order_Number__c 項目および Checkbox 型の Has_Shipped__c 項目を定義します。このテストクラスは、イベントを再試行する関連付けられたトリガ (OrderTriggerRetry) があることを前提とします。このトリガはこの例では提供されていません。
1@isTest
2public class MyTestClassRetryDoc {
3
4 @isTest static void doSomeTesting() {
5
6 Test.startTest();
7
8 // Publish a test event
9 Order_Event__e event = new Order_Event__e(
10 Order_Number__c='12345', Has_Shipped__c=true);
11 Database.SaveResult sr = EventBus.publish(event);
12 // Deliver the initial event message.
13 // This will fire the associated event trigger.
14 Test.getEventBus().deliver();
15
16 // Trigger retries event twice, so loop twice
17 for(Integer i=0;i<2;i++) {
18 // Get info about all subscribers to the event
19 EventBusSubscriber[] subscribers =
20 [SELECT Name, Type, Position, Retries, LastError
21 FROM EventBusSubscriber WHERE Topic='Order_Event__e'];
22
23 for (EventBusSubscriber sub : subscribers) {
24 System.debug('sub.Retries=' + sub.Retries);
25 System.debug('sub.lastError=' + sub.lastError);
26 if (sub.Name == 'OrderTriggerRetry') {
27 System.assertEquals(i+1, sub.Retries);
28 }
29 }
30
31 // Deliver the retried event
32 Test.getEventBus().deliver();
33 }
34
35 Test.stopTest();
36
37 }
38}