hibernate - 比较 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!
经检查,返回的域对象的正确日期为dateCreated
3 年前。
同样,此错误仅发生在测试事务中创建的数据,而不是已提交到测试数据库的数据。
感觉可能日期在休眠缓存中的格式不同。但我不知道如何调试休眠缓存。
谢谢你的帮助!
解决方案
推荐阅读
- amazon-web-services - 如何使用 jmeter POST 方法在 aws 中创建 s3 存储桶
- z3 - z3:枚举类型、ADT 和递归函数
- websocket - AsyncAPI:如果两端都作为生产者和消费者,将使用多少个 websocket?
- angular - 不能绑定到“粘性”,因为它不是“kendo-grid-column”的已知属性
- leaflet - 同一位置的多个标记上的传单工具提示问题
- google-apps-script - 如何从 CalendarApp.CalendarEvent 访问视频链接?
- java - 无法解析 m1 macbook air 上的符号“字符串”
- postgresql - 为什么 Flask-SQLAlchemy 在 SELECT 查询后会回滚
- python - Python:无法将 numpy 数组转换为字符串
- java - 使用spring boot从属性文件加载枚举映射