Batch Apex の実行時に発生するエラーについて
Batch Apexのテストクラスを実行して下記のようなエラーを目にした方はいないでしょうか?
原文:
System.UnexpectedException: No more than one executeBatch can be called from within a test method.
Please make sure the iterable returned from your start method matches the batch size, resulting in one executeBatch invocation.
和訳:
System.UnexpectedException:テストメソッド内から呼び出すことができるexecuteBatchは1つだけです。
startメソッドから返されるiterableがバッチサイズと一致していることを確認してください。その結果、executeBatchが1回呼び出されます。
エラー文では若干遠回しな言い方をしていますが、要は・・・
・Startメソッドで取得したレコードが多くてバッチサイズ超えてるよ。
・バッチサイズ超えてるから2回目のexecuteが動いてるよ
・executeが2回以上動いているからエラーにしたよ。
という話です。
#解決方法
下記のような形でテストの時のみStartメソッドで取得するレコードを、バッチサイズ以下の数値になるように
分岐させるだけでOkです。
if (Test.isRunningTest()){
query = 'SELECT Id , FROM User WHERE Account AND LIMIT [指定したバッチサイズ以下の数値]';
} else {
query = 'SELECT Id , FROM User WHERE Account AND LIMIT 50000';
}
#最後に
上の例に限らずテストクラスの時のみ運用とは異なった処理をする必要がある場合に
Test.isRunningTest()は有用なので是非使ってみてください。
ただしテスト実行時に分岐のfalse側のカバー率は担保できないため、
カバー率が担保できないほど多用しないようにしましょう。