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

環境
Salesforce

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

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

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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;
}
}
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; } }
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.テストクラスの定義

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
@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);
}
}
@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); } }
@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