この文章は Salesforce 機械翻訳システムを使用して翻訳されました。詳細はこちらをご参照ください。
英語に切り替える

再試行されたイベントメッセージのテスト

Apex トリガーで EventBus.RetryableException を発生させることで、イベントメッセージの処理を再試行できます。API バージョン 43.0 以降では、Test.EventBus.deliver() をコールして EventBusSubscriber 項目を調べることで、再試行されたイベントメッセージをテストできます。

Apex テストで再試行されたイベントメッセージを強制的に再配信するには、Test.EventBus.deliver() をコールします。このメソッドでは、最後の deliver() コール以降に公開された他のイベントメッセージも配信されます。

API バージョン 43.0 以降では、次の新しい EventBusSubscriber 項目を確認して、再試行されたトリガーをテストできます。

  • Retries
  • LastError

EventBusSubscriber.Retries 項目は、トリガーが再試行された回数を示します。

EventBusSubscriber.LastError は、最後に実行された throw ステートメントに渡されたエラーメッセージを示します (throw new EventBus.RetryableException('Error Message'))。

EventBus.RetryableException が発生すると、トリガーでイベントメッセージが正常に処理されなかったために EventBusSubscriber.Position が増分されなくなります。

メモ

このテストメソッドは、トリガーを起動するテストイベントメッセージを配信します。関連付けられたイベントトリガーで 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}