首页 > 解决方案 > 比较 dateCreated 的查询不适用于在 Grails 3.3.10 的测试事务中创建的测试数据

问题描述

我们正在将集成测试从 Grails 2.3.11 应用程序迁移到 Grails 3.3.10。GORM 版本 6.1.12。

我特别遇到了两个测试的问题。这两个问题都与在测试事务中设置的测试数据中查询日期有关,特别dateCreated是将对象的日期与服务中生成的日期进行比较。

User域对象中,这是dateCreated通常由 Grails(或 GORM?)管理的字段。

在一种情况下,这是在 HQL 中完成的

Date twoYearsAgo = new Date()
use(TimeCategory) {
  twoYearsAgo = twoYearsAgo - 2.years
}

User.executeQuery("""
  select id
  from User
  where dateCreated > :cutoff
""", [cutoff: twoYearsAgo])

另一个是使用标准

Date aMonthAgo = new Date()
use(TimeCategory) {
  aMonthAgo = aMonthAgo - 1.month
}

User.createCriteria().list {
  le("dateCreated", aMonthAgo)
}

这些是从我们的实际代码中简化而来的。

在我们的引导过程中将数据提交到测试数据库的测试中,这两个服务查询似乎都可以正常工作。

问题是它们似乎不适用于测试事务中的测试数据设置。

例如,第一个查询将返回带有dateCreated < cutoff.

在测试中,我设置了这样的测试数据

User user = new User()
Date threeYearsAgo = new Date()
use(TimeCategory) {
  threeYearsAgo = threeYearsAgo - 2.years
}
user.dateCreated = threeYearsAgo
user.save(flush: true)

然后我调用我的服务功能

List<User> list = service.serviceFunction()

它返回类似这样的查询结果

Date twoYearsAgo = new Date()
use(TimeCategory) {
  twoYearsAgo = twoYearsAgo - 2.years
}

return User.executeQuery("""
  select id
  from User
  where dateCreated > :cutoff
""", [cutoff: twoYearsAgo])

然后回到测试中,这个断言失败了

assert list[0].dateCreated > twoYearsAgo // this is false!

经检查,返回的域对象的正确日期为dateCreated3 年前。

同样,此错误仅发生在测试事务中创建的数据,而不是已提交到测试数据库的数据。

感觉可能日期在休眠缓存中的格式不同。但我不知道如何调试休眠缓存。

谢谢你的帮助!

标签: hibernategrailsgroovygrails-ormspock

解决方案


推荐阅读