tyoshikawa1106のブログ

- Force.com Developer Blog -

SFDC:How to Test - System.runAs と MIXED DML OPERATION

Salesforceでは非設定オブジェクト(取引先やグループなど)に対してDML 操作を実行した後に、設定オブジェクト(ユーザやグループメンバーなど)に対してDML 操作を実行するとMIXED_DML_OPERATIONエラーが発生してしまいます。

f:id:tyoshikawa1106:20140423233603p:plain


通常の処理では@futureをつかった非同期処理で回避できますが、テストクラスでつかうテストデータ作成のために非同期処理で対応するのは少し面倒です。


そんなときはSystem.runAsを宣言することでエラーを回避することが可能です。System.runAsはポータルユーザや特定プロファイルのユーザなどテストを実行するユーザを指定したい場合に宣言するのですが、このSystem.runAsを宣言することでグループとグループメンバーの登録を同時に実行してもエラーが発生しなくなります。(複数のSystem.runAsに分ける必要もないみたいです。)

f:id:tyoshikawa1106:20140423230949p:plain

f:id:tyoshikawa1106:20140424003444p:plain


System.runAsで回避できるのはテストデータ登録時のエラーだけではありません。例えばApexTriggerで取引先をINSERTしたときにグループとグループメンバーを登録する処理があった場合、きちんと非同期処理でメンバーを登録するようにしてあっても、テストクラスで取引先をINSERTしたときにMIXED_DML_OPERATIONエラーになってしまいます。この問題もSystem.runAsを宣言しておくことでエラー発生を回避することができます。


このようなトリガーを追加したときに既存のテストクラス修正しようとするといろいろ大変です。System.runAsを宣言しておけば回避できるのでユーザの切り替えが必要なくてもSystem.runAsは宣言するようにしておいた方が安全だと思います。