私はJUnitを使用して、Postgresデータベースにアクセスするリポジトリをテストしています。Postgresのcurrent_timestampをJUnitテストの定数に設定しますか?
すべてのテストデータは手動で設定されていたので、結果に期待する値が正確にわかっています。 current_timestamp
を使ってステートメントをテストするのに苦労します。select * from phone_number where current_timestamp <= expires;
問題は私のテストデータが一定ですが、テストの実行ごとに時間が進んでいくということです。
current_timestamp
に一定の値を返す方法はありますか?もちろん
これは、私は3つの解決策だったいくつかのオプションのいずれか、次のようになります。
- は私のテストデータで基準日(すなわち、エポック、
base_date timestamp default current_time
のようなもの)を定義します。他のすべてのデータは、そのエポックデータの後の間隔として定義されます(例:base_date + interval '1 day'
)。私のテストの荒いランタイムを知っているので、私はタイムスタンプをテスト中に絶対に超えないように設定することができます(例えば、ランタイムが秒のbase_date
の後の時間)。私のテストデータに変数を入れておくと、チェックするのが難しくなります。 - の使用を中止し、通常の使用(Javaの場合)で
System.currentTimeMillis()
またはnew java.util.Date()
(いずれの場合も 'now')のようなものになり、私のテストでは一定の日付。私はこのソリューションのファンではありません。なぜなら、a)通常の使用法(テストの外)で必要とされない変更を導入するためです。b)追加のパラメータは追加のエラーの原因です。 - 'testing mode'がオンであり、代わりに定数を返す必要があることを示す特定の値が存在しない限り、
current_timestamp
を返すストアドプロシージャを定義します。これは実際にはうまくいくかもしれませんが、Postgresでcurrent_timestamp
が返す簡単な方法があれば必要ではないかもしれません。代わりに型付けされたリテラル値をクエリ文字列にcurrent_timestamp
を交換し、データベース自体に何かをしようとしている、またはちょうどあなたがあなたのユニットテストであなたのデータベース呼び出しをラップすることができ、特定のテストを可能にするようにコードをリファクタリングする
** single **トランザクションですべてを実行すると、その間に 'current_timestamp'は変更されません –