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);
}
}