技術的雑談-java.util.Dateは使ってはいけない
環境
Java(バージョン問わず)
現象
- テストのときにとても苦労することになります…。
原因
java.util.Date classはDefault Constractorでnewすると実行時点での現在時刻を内部に保持します。
log出力のTimestampの為などであれば良いのですが、その他の場合「時刻」は以下のどれかの使い方をされることがほとんどだと思われます。
- スケジュール機能を実装する際にスケジュール時刻が来たことを判定する
- タイムアウト処理などのために経過時間を測定する
どちらのケースでもUnit Testを行う際にテスト成功条件を演算によって可変にするか、もしくはテスト実施のタイミングを設定に合わせる必要が生じ、テストの成功条件が固定的でなくなります。
もしくはテスト成功条件を処理によって求める必要が生じることにより、テスト成功条件の実装ミスでテストケースにバグを作ってしまう可能性が生じます。
仮に、真夜中にしか動作しないようなロジックのテストをする為にテスト実施者は真夜中まで残業しますか?
対処
- djUnitやEasyMockなどのMock ObjectをTestCase内で使用し、java.util.DateをMock化する。
- 現在時刻の取得目的でjava.util.Dateをnewする箇所を単一化し、現在時刻が必要な部分はそこから現在時刻を取得するように実装する。(プログラム中にnew Date()が散らばっている状態を回避する。)
履歴
2008/03/25 -- 初版
技術的雑談へ戻る