executeUpdate()没有更新grails spock-integration测试

时间:2015-10-30 06:15:39

标签: grails groovy integration-testing spock

嗨,我是Grails测试的新手。愿意进行如下集成测试但是 问题是executeUpdate()似乎没有更新值

如何进行集成测试 executeUpdate('update query goes here') ??

请帮忙建议我 示例代码用于问题演示。 提前谢谢。

def "for given merchantTier Id update merchantTier value"(){
    setup:
    def merchantTier = new MerchantTier(              
            value:1.11).save(flush: true) //it saves merchantTier

    when:"when update with setProperty"
    testData = editWithSetProperty(merchantTier.id) //id is passed

    then:"it updates data and test is success"
    merchantTier.value == 2.22

    when:"executeUpdate query is used instead"
    testData = editWithExecuteUpdate(merchantTier.id)// id is passed

    then:"it does not update the data and test is failed"
    merchantTier.value == 3.33
}

def editWithSetProperty(id) {
    def merchantTier = MerchantTier.get(id.toLong())
    merchantTier.setValue(2.22.toDouble())
}

def editWithExecuteUpdate(id) {
        MerchantTier.executeUpdate('update MerchantTier mt set mt.value=:mrValue where mt.id=:mtId', [mrValue: 3.33.toDouble(), mtId: id.toLong()])
}

如何进行集成测试 executeUpdate('update query goes here') ??

1 个答案:

答案 0 :(得分:0)

当您通过executeUpdate进行更新时,您再次需要从数据库中获取对象,因此请尝试在editWithExecuteUpdate中返回从数据库中获取的新对象

def editWithExecuteUpdate(id) {
    MerchantTier.executeUpdate('update MerchantTier mt set mt.value=:mrValue where mt.id=:mtId', [mrValue: 3.33.toDouble(), mtId: id.toLong()])
    merchantTier = MerchantTier.get(id)
}

一旦完成,您将在when:clause

中包含包含merchantTier对象的testData

所以在那时:子句有

 testData.value == 3.33

希望这是有道理的。感谢

编辑 - 附加方式

def editWithExecuteUpdate(id) {
    def updatedRecords = MerchantTier.executeUpdate('update MerchantTier mt set mt.value=:mrValue where mt.id=:mtId', [mrValue: 3.33.toDouble(), mtId: id.toLong()])
    return updatedRecords
}

所以在then:子句中由于executeUpdate只应根据唯一ID更新一行,并再次获取新对象并检查持久值

 testData == 1
 def freshMerchantTier = MerchantTier.get(merchantTier.id)
 freshMerchantTier.value == 3.33

请尝试一次这样的方式。感谢