tyoshikawa1106のブログ

- Force.com Developer Blog -

SFDC:Apex開発で「SandboxPostCopy」インターフェースを試してみました

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

f:id:tyoshikawa1106:20191217184348p:plain

SandboxPostCopy インターフェース


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

カスタム設定を用意

用意したカスタム設定はこちら。チェックボックス項目を保持するだけのシンプルな設定です。
f:id:tyoshikawa1106:20191217184812p:plain

f:id:tyoshikawa1106:20191217184931p:plain

Apexコード

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


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


実行処理はrunApexClassメソッドに記載すれば良いのですが、今後実行処理が増えていった際にメンテナンス性が低下しないように細かい処理は別のメソッドに記載しました。


SOQLクエリはDaoクラスに記載しています。カスタム設定もオブジェクト扱いなのでSOQLクエリで取得することが可能です。
f:id:tyoshikawa1106:20191217185611p:plain


SandboxPostCopyインターフェースのテストクラスはこんな感じ。
f:id:tyoshikawa1106:20191217185846p:plain


『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クラスは省略します。