[解決済み] 時間の影響を受けやすいコードをテストするために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に置き換えていきます。
関連
-
エラー java.util.NoSuchElementException
-
プロジェクトの依存関係を解決できなかった 解決
-
マスキング このリソースにアクセスするには、完全な認証が必要です。
-
ブラウザでの大容量ファイルスライスアップロード(Javaサーバサイド実装)
-
[解決済み] Javaの「for each」ループはどのように機能するのですか?
-
[解決済み] 特定のUnicode文字を含むコメントでのJavaコードの実行が許可されているのはなぜですか?
-
[解決済み] Eclipseが起動できない - Javaは起動したが終了コード=13を返した
-
[解決済み] Javaでメソッドの実行時間を計るにはどうしたらいいですか?
-
[解決済み] Java JITは、JDKのコードを実行するときに不正をするのですか?
-
[解決済み】JSP 2を使用して、JSPファイル内のJavaコードを回避するにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
この行に複数のマーカーがある - HttpServletResponseが型エラーに解決できない
-
Eclipseで "XXXX "の解決策を(型に)解決することができない
-
サーブレットクラスのインスタンス化エラーの解決法
-
リソースの読み込みに失敗しました。サーバーはステータス500(内部サーバーエラー)で応答しました。
-
が 'X-Frame-Options' を 'deny' に設定しているため、フレーム内にある。
-
linux run jarfile Invalid or corrupt jarfile error.
-
java.lang.NoClassDefFoundError: org.apache.jasper.el.ELContextImpl クラスを初期化できませんでした。
-
SocketTimeoutExceptionです。読み込みがタイムアウトしました
-
テストが見つかりませんでした
-
[解決済み】AndroidプロジェクトでThreeTenABPを使用する方法