【问题标题】:Testing with mocked value for current_timestamp on H2在 H2 上使用 current_timestamp 的模拟值进行测试
【发布时间】:2021-04-19 11:47:28
【问题描述】:

有没有办法在 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 设置一个固定(也称为模拟)值,以避免在最终 current_timestamp 大于 e.endDate 时破坏此测试。

还有其他更好的方法来让它运行吗? 我想避免将 current_timesamp 作为查询参数传递。

【问题讨论】:

    标签: spring-boot jpa h2 jpql


    【解决方案1】:

    您可以将;BUILTIN_ALIAS_OVERRIDE=TRUE 添加到 JDBC URL 并为您自己的函数定义一个别名

    CREATE ALIAS CURRENT_TIMESTAMP FOR "path.to.YourClass.staticMethod"
    

    命令。

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

    H2 应该能够在类路径中找到您的类(如果您使用 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); }';
    

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

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

    【讨论】:

      猜你喜欢
      • 2023-01-31
      • 2019-04-01
      • 1970-01-01
      • 2012-11-10
      • 2013-08-05
      • 1970-01-01
      • 2018-02-03
      • 2011-12-31
      • 1970-01-01
      相关资源
      最近更新 更多