Contents
概要
「最大スタック深度に達しました(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%を実現できなくなってしまう。