tyoshikawa1106のブログ

- Force.com Developer Blog -

SFDC:Database.QueryLocatorのテスト方法

f:id:tyoshikawa1106:20150612215920p:plain

QueryLocator クラスはApex の一括処理で使用されるレコードセットです。Apex Batchを開発するときの『start()』などで使用されています。このDatabase.QueryLocatorのテスト方法についてです。


まず、Database.QueryLocatorの処理はこんな感じになります。
f:id:tyoshikawa1106:20150612220406p:plain


実行結果はList<Account>のような感じにはならないのでこのままでは取得件数は確認できません。テストをする場合は、Database.QueryLocatorクラスに用意されている『getQuery()』を使用します。

f:id:tyoshikawa1106:20150612220710p:plain


『getQuery()』を使用するとDatabase.QueryLocatorのクエリ部分を取得することができます。取得結果はString型なので『String.isNotEmpty(resultQuery)』というように存在判定が可能です。

Database.QueryLocator result = dao.getQueryLocator();
String resultQuery = result.getQuery();

後は『database.query(resultQuery)』という感じでレコード取得処理を実行できます。これで作成したクエリが正しく動作しているかの検証が可能になります。

List<Account> resultAccounts = database.query(resultQuery);

f:id:tyoshikawa1106:20150612221153p:plain


ちなみにgetQueryLocator クエリで FOR UPDATE キーワードを使用してレコードのセットをロックすることはできませんが、start メソッドは、バッチにあるレコードのセットを自動的にロックされる仕組みとなっています。

サンプルコード