「You have uncommitted work pending.Please commit or rollback before calling out」エラー

By | October 17, 2020

概要

トラウマランキングNo.1エラー。

エラーの中身は文字通り、「Calloutの実行前にトランザクションをコミットするなりロールバックするなりして終わらせよ」というもの。

恐ろしいのは、指示通りに修正してもエラーが消えないという点…

一般的な対策法

コード側

  • Calloutメソッドを非同期化する(@futureアノテーションを付けるorQueueableインタフェースを利用する。)
  • Calloutの前にDML操作やロールバックを終わらせてトランザクションを完了させる。

テスト側

  • コールアウトクラスの呼び出しメソッドをTest.startTest()とTest.stopTest()で挟む
  • Test.setMockでMock Classを呼び出す
Test.startTest();
Test.setMock(HttpCalloutMock.class, new boardOppApiMock());
BoardOppPost.CreateBoardOppCallout(FlowVariables);
Test.stopTest();

上記の対策を行ってもエラーが出続ける場合

結論、上記の対策を行ってもエラーは出続けます。

現在発生中のSalesforceのバグです。

下記のIdeaにある通り、コールアウトクラスのAPIバージョンを34以下に設定すると解決します。Spring’21修正予定です。

https://trailblazer.salesforce.com/issues_view?id=a1p3A000000ATF1QAO