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