Apex コールアウトに future メソッドを使用する方法

環境
Salesforce

構文
future メソッドは静的メソッドである必要があり、void 型のみを返します。
指定するパラメーターはプリミティブデータ型、プリミティブデータ型の配列、プリミティブデータ型のコレクションである必要があります。
外部サービスまたは API への Web サービスコールアウトを実行するには、(callout=true) でマークされた
future メソッドを使用して Apex クラスを作成します。

操作例
1.コールアウトコードの定義

public class SENDSMSUtil{
    // コールアウトが許可されていないトリガーなどから非同期を呼び出す
    @future(callout=true)
    public static void sendMsgAsync(String fromNbr, String toNbr, String m) {
        String results = sendMsg(fromNbr, toNbr, m);
        System.debug(results);
    }
    // コントローラーなどから呼び出して即時処理
    public static String sendMsg(String fromNbr, String toNbr, String m) {
        // 「send」を呼び出すとコールアウトが発生
        String results = SmsMessage.send(fromNbr, toNbr, m);
        insert new SMS_Log__c(to__c=toNbr, from__c=fromNbr, msg__c=results);
        return results;
    }
}

2.テストクラスの定義

@IsTest
private class Test_SENDSMSUtil{
  @IsTest
  private static void testSendSms() {
    Test.setMock(HttpCalloutMock.class, new SMSCalloutMock());
      
    Test.startTest();
      SMSUtils.sendSMSAsync('from11', 'to22', 'test message');
    Test.stopTest();
    
      // コールアウトを実行して結果を確認する
    List<SMS_Log__c> logs = [select msg__c from SMS_Log__c];
    System.assertEquals(1, logs.size());
    System.assertEquals('success', logs[0].msg__c);
  }
}

 

Apex

Posted by arkgame