こんにちは、にいるです。
今日は、Trailheadのモジュール「Apex 一括処理の使用」について、解答と解説をまとめたいと思います。
非同期処理について、詳しく説明した記事と合わせてご覧ください。
・【Salesforce】非同期処理の特徴と使い方について
・【Trailhead】Apex 一括処理の使用
1.チャレンジ内容
チャレンジ内容です。
1-1.原文
Create an Apex class that uses Batch Apex to update Lead records.
Create an Apex class that implements the Database.Batchable interface to update all Lead records in the org with a specific LeadSource. Write unit tests that achieve 100% code coverage for the class.
- Create an Apex class called ‘LeadProcessor’ that uses the Database.Batchable interface.
- Use a QueryLocator in the start method to collect all Lead records in the org.
- The execute method must update all Lead records in the org with the LeadSource value of ‘Dreamforce’.
- Create an Apex test class called ‘LeadProcessorTest’.
- In the test class, insert 200 Lead records, execute the ‘LeadProcessor’ Batch class and test that all Lead records were updated correctly.
- The unit tests must cover all lines of code included in the LeadProcessor 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.和訳
BatchApexを使用してリードレコードを更新するApexクラスを作成します。
Database.Batchableインターフェイスを実装するApexクラスを作成して、組織内のすべてのLeadレコードを特定のLeadSourceで更新します。 クラスのコードカバレッジを100%達成する単体テストを作成します。
- Database.Batchableインターフェイスを使用する「LeadProcessor」というApexクラスを作成します。
- startメソッドでQueryLocatorを使用して、組織内のすべてのリードレコードを収集します。
- executeメソッドは、組織内のすべてのLeadレコードを「Dreamforce」のLeadSource値で更新する必要があります。
- ‘LeadProcessorTest’というApexテストクラスを作成します。
- テストクラスで、200個のLeadレコードを挿入し、「LeadProcessor」バッチクラスを実行して、すべてのLeadレコードが正しく更新されたことをテストします。
- 単体テストは、LeadProcessorクラスに含まれるコードのすべての行をカバーする必要があり、100%のコードカバレッジが得られます。
- このチャレンジを検証する前に、テストクラスを少なくとも1回実行します(「すべて実行」を使用して開発者コンソールをテストします)。
2.解答と解説
2-1.Apexクラス
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
global class LeadProcessor implements Database.Batchable<sObject> { global Database.QueryLocator start(Database.BatchableContext bc) { return Database.getQueryLocator('SELECT Id FROM Lead'); } global void execute(Database.BatchableContext bc, List<Lead> scope){ List<Lead> leadList = new List<Lead>(); for (Lead l : scope){ l.LeadSource = 'Dreamforce'; } } global void finish(Database.BatchableContext bc){ } } |
これは見た通り、startメソッドでデータを取得して、executeで実装したい処理を記述してるだけですね。
finishは何も書いていないですが、メール通知やexecuteの更新数を渡して通知に使うことができます。
statefulを使用すれば各トランザクション間で値保持もできます。
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 |
@isTest public class LeadProcessorTest { @testSetup static void setup(){ List<Lead> leadList = new List<Lead>(); for( Integer i = 0; i < 200; i++){ LeadList.add(new Lead( Company = 'Test' + i, LastName = 'Name' + i )); } Insert LeadList; } @isTest static void test() { System.Test.startTest(); LeadProcessor lp = new LeadProcessor(); Database.executeBatch(lp); System.Test.stopTest(); } } |
3.まとめ
いかがでしたでしょうか。
バッチ処理はApexの非同期処理で最も使用する頻度が高い構文だと思います。
一度、書いてしまえばなかなか書くことはないと思いますが、構文だけでもしっかりと覚えておきましょう。
皆さんもぜひ色々と試してみてください。
他にも色々と標準機能やSalesforce機能について紹介していますので、ご覧ください。
ではでは!
コメント