拡張トランザクションセキュリティの Apex テスト
| 使用可能なインターフェース: Salesforce Classic および Lightning Experience |
| 使用可能なエディション: Enterprise Edition、Performance Edition、Unlimited Edition、および Developer Edition Salesforce Shield または Salesforce Event Monitoring アドオンサブスクリプションが必要です。 |
開始するために単体テストの例を見てみましょう。次の Apex ポリシーをテストするとします。
テストの計画および記述
テストの記述を開始する前に、テスト計画で対象とするプラスとマイナスの使用事例の概要を確認しましょう。
| evaluate メソッドが受信した場合... | かつ... | evaluate メソッドが返す... |
|---|---|---|
| ApiEvent オブジェクト | ApiEvent で Lead がその QueriedEntities 項目にあり、2000 より大きい数値が RowsProcessed 項目にある | true |
| ReportEvent オブジェクト | ReportEvent で Lead がその QueriedEntities 項目にあり、2000 より大きい数値が RowsProcessed 項目にある | true |
| ListViewEvent オブジェクト | ListViewEvent で Lead がその QueriedEntities 項目にあり、2000 より大きい数値が RowsProcessed 項目にある | true |
| 任意のイベントオブジェクト | イベントで Lead がその QueriedEntities 項目になく、2000 より大きい数値が RowsProcessed 項目にある | false |
| 任意のイベントオブジェクト | イベントで Lead がその QueriedEntities 項目にあり、2000 以下の数値が RowsProcessed 項目にある | false |
| 任意のイベントオブジェクト | イベントで Lead がその QueriedEntities 項目になく、2000 以下の数値が RowsProcessed 項目にある | false |
| evaluate メソッドが受信した場合... | かつ... | evaluate メソッドが返す... |
|---|---|---|
| LoginEvent オブジェクト | (条件なし) | false |
| null 値 | (条件なし) | false |
| ApiEvent オブジェクト | QueriedEntities 項目が null である | false |
| ReportEvent オブジェクト | RowsProcessed 項目が null である | false |
次に、こうしたすべての使用事例を実装する Apex テストコードを示します。
テスト実行後のポリシーコードの調整
テストを実行し、testNullQueriedEntities テストケースが失敗してエラー System.NullPointerException: Attempt to de-reference a null object が起こったとします。幸い、テストで予期しない値または null 値をチェックしないトランザクションセキュリティポリシーの領域が明らかになりました。ポリシーは重要な組織の操作中に実行されるため、重要な機能がブロックされないようにエラーがある場合はポリシーが適切に失敗することを確認します。
こうした null 値を適切に処理する Apex クラスの evaluate メソッドを更新する方法を次に示します。
queriedEntities 変数で .contains 操作を実行する前に値が null かどうかを最初にチェックするように、コードを変更しました。この変更により、コードで null オブジェクトが参照解決されなくなります。
- 値または状況を無視して、ポリシーがトリガしないように false を返す。
- true を返して操作をフェイルクローズする。
高度な例
ログインしようとしているユーザのプロファイルを取得する SOQL クエリを使用するより複雑な Apex ポリシーを次に示します。
テスト計画は次のようになります。
-
ポジティブテストケース
- ログインしようとしているユーザのプロファイルを監視したい場合は、evaluate メソッドが true を返す。
- ログインしようとしているユーザのプロファイルを監視したくない場合は、evaluate メソッドが false を返す。
-
ネガティブテストケース
- 例外を発生させるプロファイルオブジェクトのクエリを行う場合は、evaluate メソッドが false を返す。
- null を返すプロファイルオブジェクトのクエリを行う場合は、evaluate メソッドが false を返す。
すべての Salesforce ユーザに必ずプロファイルが割り当てられるため、そのネガティブテストを作成する必要はありません。2 つのネガティブテストケースに実際のテストを作成することもできません。これについては、ポリシー自体を更新することで Salesforce が行います。ただし、計画で使用事例を明示歴にリストし、さまざまな状況に対応できるようにします。
ポジティブテストケースは、SQQL クエリの結果のみに依存します。これらのクエリが正しく実行されるようにするために、テストデータも作成します。テストコードを見てみましょう。
プロファイルオブジェクトのクエリを行うときに例外または null の結果をチェックするようにトランザクションセキュリティポリシーコードを更新して、2 つのネガティブテストケースを処理しましょう。