基本的にsObjectの作成日(CreatedDate)は書き込みできません。
ユーザインターフェース 『「レコードの作成時に監査項目を設定」および「無効な所有者のレコードを更新」ユーザ権限を有効化』を有効にすることで、レコード作成時のみ設定が可能です。
本題ですが、上記の設定を使わずに、Apexテストクラスで自由に作成日を変える方法がありますので、ご紹介します。
Apexテストクラスで作成日を変更するTest.setCreatedDate関数
Test.setCreatedDateの署名
public static void setCreatedDate(Id recordId, Datetime createdDatetime)
Test.setCreatedDateの使用方法
データベースの変更はテスト終了時にすべてロールバックされます。このメソッドをテスト実行前に存在していたレコードに対して使用することはできません。また、@isTest(SeeAllData=true) アノテーションのあるメソッドでは setCreatedDate を使用できません。これらのメソッドは組織内のすべてのデータにアクセスできるためです。CreatedDate を将来の値に設定した場合、予期しない結果が生じる可能性があります。このメソッドは、sObject ID と Datetime 値の 2 つのパラメータを取ります。いずれも null にできません。
https://developer.salesforce.com/docs/atlas.ja-jp.244.0.apexcode.meta/apexcode/apex_methods_system_test.htm#apex_System_Test_setCreatedDate
@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();
}
}
Test.setCreatedDate関数でCreatedDate設定後、SOQLで再取得しないと最新のCreatedDateが取れないのでご注意ください。
どういう時に使うと良いか
Apexテスト内でSOQLのORDER BY句に作成日を指定する必要がある場合に使えます。
リストの並び順が合っているかの確認にはこの関数を使わないとパスさせることが難しいと思います。どうやらミリ秒単位の精度は保証されていない模様。