CreatedDateを設定してトリガーやロジックをテストする実践例


SalesforceのApexには、テスト環境でCreatedDateを設定するための便利なメソッドTest.setCreatedDateが用意されています。このメソッドを使用することで、監査フィールドのCreatedDateをユニットテスト内で操作可能になり、テストの柔軟性が向上します。


Test.setCreatedDateの概要

  • 目的
    CreatedDateは通常読み取り専用ですが、ユニットテスト環境ではTest.setCreatedDateを使うことで、このフィールドを設定できます。

  • 制約条件

    1. このメソッドはテスト中に作成されたレコードにのみ適用可能です。既存のレコードには使用できません。
    2. @isTest(SeeAllData=true)が付与されたメソッドでは使用できません。
    3. CreatedDateを未来の日付に設定すると、予期しない動作を引き起こす可能性があります。
    4. このメソッドはsObject IDDatetime値の2つの引数を取ります。どちらもnullにすることはできません。

使用例

以下は、AccountオブジェクトのCreatedDateを設定するユニットテストのサンプルコードです。

@isTest 
private class SetCreatedDateTest {
    static testMethod void testSetCreatedDate() {
        Account a = new Account(name='myAccount');
        insert a;
        Test.setCreatedDate(a.Id, DateTime.newInstance(2012,12,12));
        Test.startTest();
        Account myAccount = [SELECT Id, Name, CreatedDate FROM Account 
                             WHERE Name ='myAccount' limit 1];
        System.assertEquals(myAccount.CreatedDate, DateTime.newInstance(2012,12,12));
        Test.stopTest();
    }
}

コードの解説

  1. insertの順序
    Test.setCreatedDateを使用するには、まずレコードをデータベースに挿入する必要があります。挿入後にIDが生成され、これを基にsetCreatedDateを実行します。

  2. Datetimeの利用
    Datetime.newInstanceを使用して、特定の日付と時刻を生成します。この値をCreatedDateに設定します。

  3. クエリでの確認
    SELECTクエリで挿入されたレコードを取得し、CreatedDateが正しく設定されたかをSystem.assertEqualsで検証します。


注意点と活用例

注意点

  • 他の監査フィールド(例:LastModifiedDate)については、Test.setCreatedDateでは設定できません。
  • 未来日付を設定すると、後続のロジックで予期しない動作が発生する可能性があります。

活用例

  • 時間差を扱うトリガーのテスト
    例:CreatedDateからの経過日数に基づいて特定の処理を行うトリガーのテスト。

  • 特定の日付に依存するロジックのテスト
    例:キャンペーンの有効期限や契約の開始日を評価するロジック。

コメント