Apex スケジューラを使用したジョブのスケジュール
概要
Apexスケジューラは非同期処理で最もよく使うインターフェースです。
一括処理と併用すれば大量のレコードを定期実行で処理できる
問題
スケジュールされたApexを使用してリードレコードを更新するApexクラスを作成します。 特定のLeadSourceでLeadレコードを更新するSchedulableインターフェースを実装するApexクラスを作成します。 クラスのコードカバレッジを100%達成する単体テストを作成します。 これは、BatchApexで行ったことと非常によく似ています。 Schedulableインターフェースを使用する「DailyLeadProcessor」というApexクラスを作成します。 executeメソッドは、LeadSourceフィールドが空白の最初の200件のリードを検索し、それらを「Dreamforce」のLeadSource値で更新する必要があります。 ‘DailyLeadProcessorTest’というApexテストクラスを作成します。 テストクラスで、200のリードレコードを挿入し、DailyLeadProcessorクラスを実行するようにスケジュールして、すべてのリードレコードが正しく更新されたことをテストします。 単体テストは、DailyLeadProcessorクラスに含まれるコードのすべての行をカバーする必要があり、100%のコードカバレッジが得られます。 このチャレンジを検証する前に、テストクラスを少なくとも1回実行します(「すべて実行」を使用して開発者コンソールをテストします)。
Apexクラスの定義
global class DailyLeadProcessor implements Schedulable {
global void execute(SchedulableContext ctx) {
List<Lead>leadLst = [SELECT Id,LeadSource FROM Lead WHERE LeadSource = NULL LIMIT 200];
List<Lead>upLst = new List<Lead>();
for(lead ld : leadLst) {
if(ld.LeadSource ==NULL) {
ld.LeadSource = 'Dreamforce';
upLst.add(ld);
}
}
update upLst;
}
}
テストクラスの定義
Apex スケジューラを使用したジョブのスケジュール
@isTest
public class DailyLeadProcessorTest {
@testSetup
static void setup() {
List<Lead>leadLst = new List<Lead>();
for( Integer i=0; i< 200; i++){
leadLst.add(new Lead(
LastName = 'Test' + i,
Company = 'Name' + i,
LeadSource = NULL
));
Insert leadLst;
}
@isTeat
static void testMethod1() {
List<Lead>leadLst = [SELECT Id FROM Lead LIMIT 200];
Sting CRON_EXP = '0 0 0 16 4 ? 2024';
System.Test.startTest();
String jobId = System.schedule('DailyLeadProcessor',
CRON_EXP,
new DailyLeadProcessor());
System.Test.stopTest();
}
}