Apex開発で「SandboxPostCopy」インターフェースを試してみました。SandboxPostCopyインターフェースはSandboxを作成もしくは更新時に任意のApex処理を実行できる機能です。

今回は数式項目内で現在の組織が本番環境かSandbox組織かを判別するためのフラグをカスタム設定で用意し、SandboxPostCopyの処理でチェックをオフにする用途で利用してみました。
カスタム設定を用意
用意したカスタム設定はこちら。チェックボックス項目を保持するだけのシンプルな設定です。


Apexコード
開発者ガイドに記載されたサンプルコードはこちらです。『implements SandboxPostCopy』の宣言を行い、実行処理は『runApexClass』メソッドに記載すればいいようでした。

上記サンプルを参考につくってみたコードがこちらになります。

実行処理はrunApexClassメソッドに記載すれば良いのですが、今後実行処理が増えていった際にメンテナンス性が低下しないように細かい処理は別のメソッドに記載しました。
SOQLクエリはDaoクラスに記載しています。カスタム設定もオブジェクト扱いなのでSOQLクエリで取得することが可能です。

SandboxPostCopyインターフェースのテストクラスはこんな感じ。

『Test.testSandboxPostCopyScript』関数をつかってテストするようです。引数で組織IDなど渡す必要があるみたいですが、サンプルをそのまま使えば特に問題ありませんでした。
「SandboxPostCopy」インターフェースのApexコードはこんな感じで実装できました。実際に使用するときにはSandbox作成時にApexクラスを指定する箇所があるのでそこでクラス名を入力する形で設定できます。実行後ですが管理者アカウント宛に実行結果の通知メールが届きました。そのメールで実行時のエラー有無の確認が可能でした。
サンプルコード
PrepareMySandbox.cls
public with sharing class PrepareMySandbox implements SandboxPostCopy {
private PrepareMySandboxDao dao = new PrepareMySandboxDao();
/**
* runApexClass
*/
public void runApexClass(SandboxContext context) {
// カスタム設定:組織設定情報の更新
this.doUpdateOrgSettingInfo();
}
/**
* カスタム設定:組織設定情報の更新
*/
@TestVisible
private void doUpdateOrgSettingInfo() {
// カスタム設定:組織設定情報の取得
OrgSettingInfo__c orgSettingInfo = this.dao.getOrgSettingInfo();
// カスタム設定:組織設定情報の取得結果判定
if (String.isEmpty(orgSettingInfo.Id)) return;
// 本番組織フラグのチェックOFF
orgSettingInfo.IsProductOrg__c = false;
// UPDATE
update orgSettingInfo;
}
}
PrepareMySandboxTest.cls
@isTest
private class PrepareMySandboxTest {
private static User testAdminUser = CommonTester.getLoginUser();
/**
* runApexClass
*/
@isTest static void runApexClassTest() {
System.runAs(testAdminUser) {
Test.startTest();
// testSandboxPostCopyScript
Test.testSandboxPostCopyScript(new PrepareMySandbox(), UserInfo.getOrganizationId(), UserInfo.getOrganizationId(), UserInfo.getOrganizationName());
Test.stopTest();
}
}
/**
* カスタム設定:組織設定情報の更新
*/
@isTest static void doUpdateOrgSettingInfoest() {
System.runAs(testAdminUser) {
OrgSettingInfo__c orgSettingInfo = CommonTester.createOrgSettingInfo(false);
orgSettingInfo.IsProductOrg__c = true;
insert orgSettingInfo;
Test.startTest();
// カスタム設定:組織設定情報の更新
PrepareMySandbox cls = new PrepareMySandbox();
cls.doUpdateOrgSettingInfo();
Test.stopTest();
OrgSettingInfo__c result = [SELECT Id,IsProductOrg__c FROM OrgSettingInfo__c WHERE Id =: orgSettingInfo.Id LIMIT 1];
System.assert(orgSettingInfo.IsProductOrg__c, false);
}
}
}※Daoクラスは省略します。