Salesforceにおいて条件が相応しいオブジェクトのデータを一括処理するバッチと作成した機能が要件を満たしたのかを試すテストクラスが欠かせない存在とも言える。この記事ではバッチとバッチクラスのテストコードの書き方を私のコードをサンプルにして紹介します。
1.バッチの書き方
まずはバッチから作りましょう。Apex 一括処理を行うクラスとしてはバッチ開始、バッチ実行、バッチ終了この3部分に分かれます。このバッチは標準オブジェクトのAccountとカスタムオブジェクトRMBusinessSectionList__cを連携法人番号一致するレコードを一括処理を行う機能です。こちらのコードのサンプルを見てください。
public class AccountLinkRMList implements Database.Batchable<SObject>{
/**
* バッチ開始
* 必要なオブジェクトデータを読み込む
* */
public Database.QueryLocator start(Database.BatchableContext BC){
return Database.getQueryLocator('SELECT Id,Corporate_Number__c,Name FROM Account WHERE Corporate_Number__c!=null');
}
/**
*バッチ実行
* オブジェクトデータに対する一括処理を行う
* */
public void execute(Database.BatchableContext BC, List<Account> scope){
//カスタム表示ラベル(7日)を読み込む
Integer AccountLinkRMListPeriod = Integer.valueOf(System.Label.AccountLinkRMListPeriod);
//今日の日付を所得し逆算して期限の日付も取得
Date today = Date.today();
Date bd=today.addDays(-AccountLinkRMListPeriod);
//Accountの法人番号とIdをmapにセットする
Map<String,Id> accounts = new Map<String,Id>();
for (Account acc : scope){
accounts.put(acc.Corporate_Number__c,acc.Id);
}
//最終更新日が有効期限内かつ法人番号がAccountオブジェクトと同じものが存在するレコードを取得
List<RMBusinessSectionList__c> RMlist = [SELECT Id,Corporate_Number__c,Account__c,LastModifiedDate
FROM RMBusinessSectionList__c WHERE LastModifiedDate > :bd AND Corporate_Number__c IN :accounts.keyset()
];
//Accountオブジェクトレコードと同じ法人番号持つRMBusinessSectionList__cオブジェクトレコードをリスト化しAccount項目にIdを加えて更新
List<RMBusinessSectionList__c> updateL =new list<RMBusinessSectionList__c>();
for(RMBusinessSectionList__c l:RMlist){
if(accounts.get(l.Corporate_Number__c)!=null){
l.Account__c=(accounts.get(l.Corporate_Number__c));
updateL.add(l);
}
update updateL;
}
}
/**
* バッチ終了
* */
public void finish(Database.BatchableContext BC){
System.debug('Batch finished');
}
}
2.テストクラスの書き方
実装する前にまず要件に関わるテストケース書き込んだテストクラスで要件満たしているかを確認しましょう。
@isTest
private class AccountLinkRMListTest {
// ② テストメソッド1
@isTest
static void testMethod1() {
/* ======テストデータを準備する====== */
List<RMBusinessSectionList__c> updateL =new list<RMBusinessSectionList__c>();
List<Account> testAccts = new List<Account>();
testAccts.add(new Account(Name ='TST000001', Corporate_Number__c ='123456'));
updateL.add(new RMBusinessSectionList__c( Corporate_Number__c ='123456',Account__c=null));
insert testAccts;
insert updateL;
/* ======テストメソッド起動====== */
Test.startTest();
// 対象メソッドを呼び出す
AccountLinkRMList batchable = new AccountLinkRMList();
Database.executeBatch(batchable);
Test.stopTest();
/* ======結果検証====== */
// 期待値と実行結果の検証
List<Account> scope=[SELECT Id,Corporate_Number__c,Name FROM Account WHERE Corporate_Number__c ='123456'];
List<RMBusinessSectionList__c> Rlist =[SELECT Id,Corporate_Number__c,Account__c FROM RMBusinessSectionList__c WHERE Corporate_Number__c ='123456'];
System.debug('Account before data = '+testAccts);
System.debug('RMBusinessSectionList before data = '+updateL);
System.debug('Account after data= '+scope);
System.debug('RMBusinessSectionList after data = '+Rlist);
System.assertEquals(scope[0].Id, Rlist[0].Account__c);
}
}
実行して通りましたかを確認しましょう。
生成したデータの変化を確認するにはデバッグで実行しましょう。
自分が確認したいデータの関連ワードをフィルターに入力しましょう
AccountのIdがRMBusinessSectionList__cのAccount項目に与えられたことが確認できます。
まとめ
この記事はバッチの書き方とバッチテストのクラスを簡単に記載する記事となります。基本的に個人作業した記録するため書き込んだ記事ですもし読者の方に役立つと嬉しいと思います。