こんにちは、にいるです。
今日は、Trailheadのモジュール「future メソッドの使用」について、解答と解説をまとめたいと思います。
非同期処理について、詳しく説明した記事と合わせてご覧ください。
・【Salesforce】非同期処理の特徴と使い方について
・【Trailhead】future メソッドの使用
1.チャレンジ内容
チャレンジ内容です。
1-1.原文
Create an Apex class that uses the @future annotation to update Account records.
Create an Apex class with a method using the @future annotation that accepts a List of Account IDs and updates a custom field on the Account object with the number of contacts associated to the Account. Write unit tests that achieve 100% code coverage for the class.
- Create a field on the Account object called ‘Number_of_Contacts__c’ of type Number. This field will hold the total number of Contacts for the Account.
- Create an Apex class called ‘AccountProcessor’ that contains a ‘countContacts’ method that accepts a List of Account IDs. This method must use the @future annotation.
- For each Account ID passed to the method, count the number of Contact records associated to it and update the ‘Number_of_Contacts__c’ field with this value.
- Create an Apex test class called ‘AccountProcessorTest’.
- The unit tests must cover all lines of code included in the AccountProcessor 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.和訳
@futureアノテーションを使用してアカウントレコードを更新するApexクラスを作成します。
アカウントIDのリストを受け入れ、アカウントに関連付けられた連絡先の数でAccountオブジェクトのカスタムフィールドを更新する@futureアノテーションを使用するメソッドでApexクラスを作成します。クラスのコードカバレッジを100%達成する単体テストを作成します。
- タイプNumberの「Number_of_Contacts__c」という名前のフィールドをAccountオブジェクトに作成します。このフィールドには、アカウントの連絡先の総数が保持されます。
- アカウントIDのリストを受け入れる「countContacts」メソッドを含む「AccountProcessor」というApexクラスを作成します。このメソッドは@futureアノテーションを使用する必要があります。
- メソッドに渡されたアカウントIDごとに、それに関連付けられている連絡先レコードの数をカウントし、「Number_of_Contacts__c」フィールドをこの値で更新します。
- ‘AccountProcessorTest’というApexテストクラスを作成します。
- 単体テストは、AccountProcessorクラスに含まれるコードのすべての行をカバーする必要があり、100%のコードカバレッジが得られます。
- このチャレンジを検証する前に、テストクラスを少なくとも1回実行します(「すべて実行」を使用して開発者コンソールをテストします)。
2.解答と解説
このチャレンジは取引先にカスタム項目を作成する必要があるので、先に作成しておきましょう。
データ型は数値で表示ラベルが「Number_of_Contacts」の項目です。
2-1.Apexクラス
Apexクラスです。
取引先の取引先連絡者数を集計する必要があるので、COUNTを使用します。
それをAggregateResultオブジェクトに格納して代入します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public class AccountProcessor { @future public static void countContacts(List<id> accIds) { List<Account> accList = new List<Account>(); for (AggregateResult ar : [SELECT AccountId a, COUNT(Id) c FROM Contact WHERE AccountId in :accIds GROUP BY AccountId ]) { accList.add( new Account( Id = (Id) ar.get('a'), Number_of_Contacts__c = (Decimal) ar.get('c') )); } update accList; } } |
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 |
@IsTest public class AccountProcessorTest { public static testmethod void TestAccountProcessorTest() { Account a = new Account(); a.Name = 'Test Account'; Insert a; Contact c = New Contact(); c.LastName ='Test Contact'; c.AccountId = a.Id; Insert c; List<Id> setAccId = new List<Id>(); setAccId.add(a.id); System.Test.startTest(); AccountProcessor.countContacts(setAccId); System.Test.stopTest(); Account Acc = [SELECT Number_of_Contacts__c FROM Account WHERE id = :a.id LIMIT 1]; System.assertEquals ( Integer.valueOf(Acc.Number_of_Contacts__c) ,1); } } |
3.まとめ
いかがでしたでしょうか。
Trailheadも解答がなかなかないのでわからない方はぜひ使ってみてください。
他にも色々と標準機能やSalesforce機能について紹介していますので、ご覧ください。
ではでは!