Trailhead Queueable Apex を使用したプロセスの制御サンプル
環境
Salesforce Apex
課題
取引先の取引先責任者を挿入する Queueable Apex クラスを作成する。
特定の州の各取引先に同じ取引先責任者を挿入する Queueable Apex クラスを作成します。
Apex クラスを作成する:
名前: AddPrimaryContact インターフェース: Queueable 第 1 引数として Contact sObject、第 2 引数として州の略称の文字列を受け入れるクラスのコンストラクタを作成する execute メソッドでは、コンストラクタに渡された州の略称で指定された BillingState を持つ最大 200 件の取引先をクエリし、各取引先に関連付けられた Contact sObject レコードを挿入する。sObject clone() メソッドを参照する。
Apex テストクラスを作成する:
名前: AddPrimaryContactTest テストクラスで、BillingState NY の取引先レコード 50 件と BillingState CA の取引先レコード 50 件を挿入する AddPrimaryContact クラスのインスタンスを作成し、ジョブをキューに登録し、BillingState が CA の 50 件の取引先それぞれについて取引先責任者レコードが挿入されたことを確認する 単体テストは AddPrimaryContact クラスに含まれるすべてのコード行をカバーし、結果のコードカバー率が 100% になる必要がある この Challenge の完了を確認する前に、Developer Console の [Run All (すべて実行)] 機能を使用して、少なくとも 1 回テストクラスを実行する
1.クラスの定義
//インターフェースQueueableの実装 public class AddPrimaryContact implements Queueable { Contact con; String state; //コンストラクタ public AddPrimaryContact(Contact con,String state) { this.con = con; this.state = state; } public void execute(QueueableContext qc) { // 最大200件 List<Account>accList = [SELECT Id FROM Account WHERE BillingState = :state LIMIT 200]; List<Contact> conList = new List<Contact>(); for (Account acc : accList){ Contact cont = con.clone(false,false,false,false); cont.AccountId = acc.Id; cont.lastname ='test'; conList.add(cont); } //取引先リストを挿入 Insert conList; } }
2.テストクラスの実装
@isTest public class AddPrimaryContactTest { @testSetup static void setup() { List<Account>accList = new List<Account>(); for(Integer i=0; i<100; i++){ if(i <50) { AccList.add(new Account( BillingState ='NY', Name = 'Test' + i )); } else { AccList.add(new Account( BillingState ='CA', Name='Test' + i )); } } Insert accList; Contact con = new Contact(LastName ='test'); Insert con; } @isTest static void testMethod1() { Contact cc = [SELECT Id From Contact]; String str = 'CA'; AddPrimaryContact apc = new AddPrimaryContact(cc,str); System.Test.startTest(); System.enqueueJob(apc); System.Test.stopTest(); System.assertEquals(50,[select count() from account where BillingState = :str]); } }