我有一个Grails 2.2.4项目,我试图为查询lastUpdated
的方法编写单元测试,如下所示:
Tile.createCriteria().list {
lt('lastUpdated', new Date() - 1)
}
此方法在现实生活中运行良好,但在单元测试中失败,因为我无法使用除lastUpdated
之外的now
创建任何测试数据。设置myTile.lastUpdated
显然不起作用,因为它是更新,因此触发自动时间戳。关闭自动时间戳需要eventTriggeringInterceptor
,这在单元测试中似乎不可用。模拟默认的Date
构造函数以返回其他值也没有帮助。直接SQL更新在单元测试中根本不可用。
这在单元测试中是否可行,或者我是否必须编写集成测试?
答案 0 :(得分:1)
有趣的是,你说模拟默认日期构造函数以返回其他值是没有用的。当我遇到像你这样的新问题时,我会经常成功地做到这一点。 根据您的情况,我会进行类似测试的单元测试:
def 'test lastUpdated query'() {
setup:
Title lessThan = new Title(lastUpdated:new Date(1477152000000)) //22 Oct 2016 16:00 UTC, should be found
Title equalTo = new Title(lastUpdated:new Date(1477238400000)) //24 Oct 2016 16:00 UTC, should not find, not less than 1 day before, but equal to 1 day before
Title notLessThan = new Title(lastUpdated:new Date(1477296000000)) //24 Oct 2016 08:00 UTC, should not find, not less than 1 day before
Date date = new Date(1477324800000) //24 Oct 2016 16:00 UTC
Date.metaClass.constructor = {-> return date}
when:
List<Title> result = service.someMethod()
then:
result.size() == 1
result.contains(lessThan)
!result.contains(equalTo)
!result.contains(notLessThan)
}