在Spock

时间:2016-10-20 09:40:17

标签: grails spock grails-2.2

我有一个Grails 2.2.4项目,我试图为查询lastUpdated的方法编写单元测试,如下所示:

Tile.createCriteria().list {
  lt('lastUpdated', new Date() - 1)
}

此方法在现实生活中运行良好,但在单元测试中失败,因为我无法使用除lastUpdated之外的now创建任何测试数据。设置myTile.lastUpdated显然不起作用,因为它是更新,因此触发自动时间戳。关闭自动时间戳需要eventTriggeringInterceptor,这在单元测试中似乎不可用。模拟默认的Date构造函数以返回其他值也没有帮助。直接SQL更新在单元测试中根本不可用。

这在单元测试中是否可行,或者我是否必须编写集成测试?

1 个答案:

答案 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)
}