我正在使用 JUnit 来测试访问 Postgres 数据库的存储库。
我的所有测试数据都是手动设置的,因此我确切地知道我期望在结果中得到什么值。我在测试使用的语句时遇到了麻烦current_timestamp,例如select * from phone_number where current_timestamp <= expires;
问题是我的测试数据是恒定的,但current_timestamp随着每次测试执行而随时间推移。
有没有办法让current_timestamp返回值恒定?
当然,这将是多种选择之一,我还有三种解决方案:
base_date timestamp default current_time)。所有其他数据被定义为该纪元数据之后的间隔(例如base_date + interval '1 day')。了解测试的大致运行时间后,我可以设置expires在测试期间绝对不会超出的时间戳(例如,base_date运行时间为秒后的几小时后)。不过,在我的测试数据中包含变量值会使检查变得更加困难。current_timestamp并在我的所有语句中使用额外的时间戳参数,在正常使用(在Java中)中将类似于System.currentTimeMillis()或new java.util.Date()(在任何情况下,“现在”),并且在我的测试中我可以传递恒定日期。不过,我不喜欢这个解决方案,因为a)它引入了正常使用(测试之外)中不需要的更改b)附加参数是附加错误的来源。current_timestamp除非存在某个值(表明“测试模式”已打开),否则该过程将返回,并且应返回一个常量。这实际上可能效果最好,但如果 Postgres 中有一种简单的方法来控制current_timestamp返回的内容,则可能没有必要。