【Apex】テスト時にシステム日付を指定したい。
テストコードで、システム日付を指定したい場合があると思います。
テストクラスがいつ実行されても、システム日付が 2019年4月1日 という前提のもと実行結果をassertしたい。みたいな。
結論を言うと、テストクラス側でシステム日付の指定はできないっぽいです。
ただしテスト対象となるクラス側で Test.isRunningTest() を使えば、やりたいことができる場合があります。
こんな感じです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
/** * サンプルクラス. */ public class SampleClass01 { /** * 本日取得処理. * @return 本日 */ public static Date getToday() { Date today; if (Test.isRunningTest()) { // テスト実行時 today = Date.newInstance(2019, 4, 1); } else { today = Date.today(); } System.debug('システム日付:' + today); return today; } } |
1 2 3 4 5 6 7 8 9 10 11 12 |
/** * サンプルクラスのテストクラス. */ @isTest public class SampleClass01Test { public static testMethod void test01() { // 本日取得 Date today = SampleClass01.getToday(); System.assertEquals(Date.newInstance(2019, 6, 1), today); } } |
サンプルクラスを通常実行した場合のデバッグログです。
今日は6月10日なので、6月10日が出力されます。
13:53:15:014 USER_DEBUG [16]|DEBUG|システム日付:2019-06-10 00:00:00 |
続いて、テストクラスから実行した場合のデバッグログです。
テスト実行時はちゃんと4月1日になっています。
13:54:09:003 USER_DEBUG [16]|DEBUG|システム日付:2019-04-01 00:00:00 |
これで、ちょっと無理やりですが、一応できることの幅は広がります。
こういうことも踏まえて、テストコードが書きやすいコーディングをしないといけないですね。
もっと上手い方法見つけたら追記します。