こんにちは、にいるです。
今日は、Trailheadのモジュール「Apex スケジューラを使用したジョブのスケジュール」について、解答と解説をまとめたいと思います。
非同期処理について、詳しく説明した記事と合わせてご覧ください。
・【Salesforce】非同期処理の特徴と使い方について
・【Trailhead】Apex スケジューラを使用したジョブのスケジュール
1.チャレンジ内容
チャレンジ内容です。
1-1.原文
Create an Apex class that uses Scheduled Apex to update Lead records.
Create an Apex class that implements the Schedulable interface to update Lead records with a specific LeadSource. Write unit tests that achieve 100% code coverage for the class. This is very similar to what you did for Batch Apex.
- Create an Apex class called ‘DailyLeadProcessor’ that uses the Schedulable interface.
- The execute method must find the first 200 Leads with a blank LeadSource field and update them with the LeadSource value of ‘Dreamforce’.
- Create an Apex test class called ‘DailyLeadProcessorTest’.
- In the test class, insert 200 Lead records, schedule the DailyLeadProcessor class to run and test that all Lead records were updated correctly.
- The unit tests must cover all lines of code included in the DailyLeadProcessor class, resulting in 100% code coverage.
- Run your test class at least once (via ‘Run All’ tests the Developer Console) before attempting to verify this challenge.
1-2.和訳
スケジュールされたApexを使用してリードレコードを更新するApexクラスを作成します。
特定のLeadSourceでLeadレコードを更新するSchedulableインターフェースを実装するApexクラスを作成します。 クラスのコードカバレッジを100%達成する単体テストを作成します。 これは、BatchApexで行ったことと非常によく似ています。
- Schedulableインターフェースを使用する「DailyLeadProcessor」というApexクラスを作成します。
- executeメソッドは、LeadSourceフィールドが空白の最初の200件のリードを検索し、それらを「Dreamforce」のLeadSource値で更新する必要があります。
- ‘DailyLeadProcessorTest’というApexテストクラスを作成します。
- テストクラスで、200のリードレコードを挿入し、DailyLeadProcessorクラスを実行するようにスケジュールして、すべてのリードレコードが正しく更新されたことをテストします。
- 単体テストは、DailyLeadProcessorクラスに含まれるコードのすべての行をカバーする必要があり、100%のコードカバレッジが得られます。
- このチャレンジを検証する前に、テストクラスを少なくとも1回実行します(「すべて実行」を使用して開発者コンソールをテストします)。
2.解答と解説
2-1.Apexクラス
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
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> updLst = new List<Lead>(); for ( Lead l : leadLst ) { if(l.LeadSource == NULL){ l.LeadSource = 'Dreamforce'; updLst.add(l); } } Update updLst; } } |
2-2.テストクラス
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
@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; } @isTest static void testMethod1(){ List<Lead> leadLst = [SELECT Id FROM Lead LIMIT 200]; String CRON_EXP = '0 0 0 15 3 ? 2022'; System.Test.startTest(); String jobId = System.schedule('DailyLeadProcessor', CRON_EXP, new DailyLeadProcessor()); System.Test.stopTest(); } } |
3.まとめ
いかがでしたでしょうか。
Apexスケジューラは非同期処理で最もよく使うインターフェースです。
一括処理と併用すれば大量のレコードを定期実行で処理できるので是非とも覚えておきたい構文です。
皆さんも色々と触ってみてください。
他にも色々と標準機能やSalesforce機能について紹介していますので、ご覧ください。
ではでは!