1. ホーム
  2. java

[解決済み] 時間の影響を受けやすいコードをテストするためにJava System.currentTimeMillisをオーバーライドする。

2022-04-27 18:14:10

質問

コード内またはJVMの引数で、現在時刻を上書きする方法はありますか? System.currentTimeMillis ホストマシンのシステムクロックを手動で変更する以外に方法はありますか?

少し背景を説明します。

私たちは、現在の日付(例えば、月1日、年1日など)を中心にロジックの多くを回転させる多くの会計ジョブを実行するシステムを持っています。

残念ながら、レガシーコードの多くは、以下のような関数を呼び出します。 new Date() または Calendar.getInstance() を呼び出すことができます。 System.currentTimeMillis .

今のところ、テスト目的では、テストが実行されているとコードが考える日時を操作するために、手動でシステム時計を更新することに行き詰まります。

そこで質問なのですが。

で返されるものを上書きする方法はありますか? System.currentTimeMillis ? 例えば、そのメソッドから戻る前に、自動的に何らかのオフセットを加算または減算するようにJVMに指示することですか?

どのように解決するのですか?

I 強く システムクロックをいじる代わりに、弾丸を食い止め、レガシーコードをリファクタリングして交換可能なクロックを使用することをお勧めします。 理想的には しかし、たとえ置換可能なシングルトンを使用したとしても、テスト容易性を得ることができます。

これは、シングルトン・バージョンの検索と置換でほぼ自動化できるだろう。

  • 置換 Calendar.getInstance()Clock.getInstance().getCalendarInstance() .
  • 交換 new Date()Clock.getInstance().newDate()
  • 交換 System.currentTimeMillis()Clock.getInstance().currentTimeMillis()

(その他必要に応じて)

このように最初の一歩を踏み出したら、あとはシングルトンを少しずつDIに置き換えていきます。