在 H2 上使用 current_timestamp 的模拟值进行测试

Testing with mocked value for current_timestamp on H2

有没有办法在 H2 上为 current_timestamp 设置固定值?

我有一个测试 运行 H2,它使用 current_timestamp 来确定寄存器是否处于活动状态,如下所示:


select t from MyTable t
where t.enabled = true
  and current_timestamp between t.startDate and t.endDate

我想在此测试中为 current_timestamp 设置一个固定的(a.k.a 模拟)值,以避免在最终 current_timestamp 大于 [=25= 时中断此测试].

有没有其他更好的方法来获得 运行? 我想避免将 current_timesamp 作为查询参数传递。

您可以将 ;BUILTIN_ALIAS_OVERRIDE=TRUE 添加到 JDBC URL 并使用

为您自己的函数定义一个别名
CREATE ALIAS CURRENT_TIMESTAMP FOR "path.to.YourClass.staticMethod"

命令。

这种方法通常应该 return java.time.OffsetDateTime(除非你使用一些过时的 H2 版本)。

H2 应该能够在 class 路径中找到您的 class(如果您使用 H2 服务器进程,则在服务器端)。

您可以直接使用 Java 代码代替 Java 方法:

CREATE ALIAS CURRENT_TIMESTAMP AS
'java.time.OffsetDateTime m() { return java.time.OffsetDateTime.of(2000, 1, 1, 0, 0, 0, 0, java.time.ZoneOffset.UTC); }';

在那种情况下,您需要在 class 路径中有一个 Java 编译器。

有关详细信息,请参阅 CREATE ALIAS 文档。