[SFDC]MIXED_DML_OPERATION例外再び – テストコード作成時の対処

以前、「salesforceの設定オブジェクトと非設定オブジェクトは同一トランザクションで更新できない」という現象に出くわしたことがあります。

[Force.com]MIXED_DML_OPERATION例外が発生して辛いです…

ユーザロールのレコード(設定オブジェクト)とカスタムオブジェクトのレコード(非設定データ)を同時に登録しようとしたためにMIXED_DML_OPERATION例外が発生してしまいましたが、この時はユーザロールの登録処理を@futureな非同期処理に切り出すことで対処しました。

そして今回、テストコードを書いていて同様のエラーに直面してしまいました。今回困ったことには、テストデータとしてUserRole(設定オブジェクト)設定済みのUser情報(非設定オブジェクト)が必要だったのです。
つまり、どちらかの処理を「そのうち登録しておいて」という感じで非同期メソッドとして切り出す方法は使えないのです。テストを実行する時点で両方のデータが揃っていないといけないので。
じゃあどうすれば良いの、ということで調べると公式ブログに良い方法が書いてありました。

Apexテストコード作成の落とし穴
Mixed DML Operations Are Allowed in Test Methods in System.RunAs() Blocks

それぞれのデータを作成する処理をsystem.runAs( ユーザ )で囲み、別々のユーザコンテキストで実行すれば良いとのこと。試すと上手くゆきました。
以下テストコードの断片。

・UserRoleとUserのデータを準備してからテスト実行

・ユーザを生成する

任意のProfileを取得する時に日本語のプロファイル名をキーにするのが超不安ですが、組織の設定を日本語にしていれば問題なさそうです。


コメントを残す