「最大スタック深度に達しました(Maximum stack depth has been reached)」エラーについて

By | October 16, 2020

概要

「最大スタック深度に達しました(Maximum stack depth has been reached)」エラーが表示される典型的なパターンは、Queueable Apexを内で別のQueueable Apexを呼び出すChaining(チェイニング)を実装し、前者に関するTest Classを実行した場合です。

Queueable Apexの利点はそこから別のQueueable Apexを呼び出すことができるというChaining(チェイニング)にあるにも関わらず、残念ながらSalesforceのApex Test はChainingに対応していません。

回避策

呼び出し元のQueueable Class内のSystem.enqueueJobメソッドをif(!Test.isRunningTest()){~}で囲むことで、テスト実行時にChainingが発生することを回避した上で、呼び出される側のQueueable ClassについてはTest Class内から直接呼び出すようにすれば問題ありません。

例えば、NekoQueueableMakerというQueueable ClassからNekoQueueableというQueueable Classを呼び出すケースだと次のようになります。

①NekoQueueableMaker Class内のNekoQueueableの呼び出し箇所を下記のように修正。

if(!Test.isRunningTest()){
System.enqueueJob(new NekoQueueable(recordid));
}

②NekoQueueable Classは別途Test Classから直接呼び出すことでカバレッジを確保

System.enqueueJob(new NekoQueueable(recordid));

回避策の悲しい点

if(!Test.isRunningTest()){~}で括っている部分についてはテストでカバーされないため、カバレッジ率100%を実現できなくなってしまう。