是否仅为测试数据覆盖Grails dateCreated和lastUpdated?

时间:2012-11-22 15:53:07

标签: grails groovy gorm grails-2.0 grails-domain-class

我有几个Grails 2.1域类,包括GORM自动管理的dateCreatedlastUpdated个字段,例如:

class Person {
    Date dateCreated
    Date lastUpdated
    String name
}

希望 Grails在运行时自动填写这些字段,但我想要创建一些测试数据,我可以手动定义这些日期的值。问题是Grails会自动设置值,如果这些字段带有拦截器,即使我已经专门设置它们。

我看过this SO question,其中介绍了如何允许更改dateCreated,但我也需要更改lastUpdated。这可能吗?

2 个答案:

答案 0 :(得分:16)

哎呀,我的错误,另一个问题中的方法确实有效,但有问题的实体被分别保存在其他地方。您似乎还需要一个明确的flush来使事情有效:

def withAutoTimestampSuppression(entity, closure) {
    toggleAutoTimestamp(entity, false)
    def result = closure()
    toggleAutoTimestamp(entity, true)
    result
}

def toggleAutoTimestamp(target, enabled) {
    def applicationContext = (ServletContextHolder.getServletContext()                                                           
                              .getAttribute(ApplicationAttributes.APPLICATION_CONTEXT))

    def closureInterceptor = applicationContext.getBean("eventTriggeringInterceptor")
    def datastore = closureInterceptor.datastores.values().iterator().next()
    def interceptor = datastore.getEventTriggeringInterceptor()

    def listener = interceptor.findEventListener(target)
    listener.shouldTimestamp = enabled
    null
}

def createTestPerson() {

    def luke = new Person(name: "Luke Skywalker")
    withAutoTimestampSuppression(luke) {

        def lastWeek = new Date().minus(7)
        luke.dateCreated = lastWeek
        luke.lastUpdated = lastWeek
        luke.save(failOnError: true, flush: true)
    }
}

答案 1 :(得分:3)

如果是集成测试,您可以使用hql update语句手动设置lastUpdated。