Grails 3 集成测试 executeUpdate,table 行属性未更新
Grails 3 Integration Test executeUpdate, table row attributes are not updating
我正在测试的服务方法如下所示
void updateOrderStatusToComplete(def orderIdList) {
if (orderIdList) {
try{
def response = Order.executeUpdate("update Order tabrr set tabrr.status = :status where tabrr.id in (:idList)", [status: "Completed", idList: orderIdList])
} catch(Exception e){
throw new RuntimeException("Error updating orders to Complete")
}
}
}
我的测试首先创建了 4 个订单:
void "updateRowsToMatch" (){
given: "we have 4 existing orders with status open"
def order1 = new Order(description: "item 1", price: 50.00, status: "Open")
order1.save()
def order2 = new Order(description: "item 2", price: 60.00, status: "Open")
order2.save
def order3 = new Order(description: "item 3", price: 70.00, status: "Open")
order3.save()
def order4 = new Order(description: "item 4", price: 80.00, status: "Open")
order4.save()
def orderIdList = [order1.id, order2.id, order3.id, order4.id]
when: "we use orderservice to update the rows status...."
orderservice.updateOrderStatusToComplete(orderIdList)
then: "the orders status should be updated to "Completed"
assert Order.get(order1.id).status == "Completed"
assert Order.get(order2.id).status == "Completed"
assert Order.get(order3.id).status == "Completed"
assert Order.get(order4.id).status == "Completed"
}
当我在测试之前用 table 行为数据库播种并使用这些 ID 时,测试通过,现有行将被更新。该问题似乎仅在我在测试中创建 table 行时出现。但有趣的是,executeUpdate 的 return 值为 4,这意味着实际上有 4 table 行已更新,所以我有点困惑为什么状态不是实际上改变。
测试使用@Integration 和@Rollback
注释,这意味着测试事务正在回滚而不是在测试期间完全提交。但我仍然可以检索使用 Order.findById(...) 或 Order.findByDescription() 保存的订单,所以我不确定为什么这在测试期间持续存在,但不是执行更新事务。
找到解决方案。刷新似乎没有用,但清除会话确实有效,所以在测试开始时 class 为 Hibernate SessionFactory
插入一个 setter
def sessionFactory
保存对象后
sessionFactory.currentSession.clear()
这样做允许更新和检索在测试中创建的对象
我正在测试的服务方法如下所示
void updateOrderStatusToComplete(def orderIdList) {
if (orderIdList) {
try{
def response = Order.executeUpdate("update Order tabrr set tabrr.status = :status where tabrr.id in (:idList)", [status: "Completed", idList: orderIdList])
} catch(Exception e){
throw new RuntimeException("Error updating orders to Complete")
}
}
}
我的测试首先创建了 4 个订单:
void "updateRowsToMatch" (){
given: "we have 4 existing orders with status open"
def order1 = new Order(description: "item 1", price: 50.00, status: "Open")
order1.save()
def order2 = new Order(description: "item 2", price: 60.00, status: "Open")
order2.save
def order3 = new Order(description: "item 3", price: 70.00, status: "Open")
order3.save()
def order4 = new Order(description: "item 4", price: 80.00, status: "Open")
order4.save()
def orderIdList = [order1.id, order2.id, order3.id, order4.id]
when: "we use orderservice to update the rows status...."
orderservice.updateOrderStatusToComplete(orderIdList)
then: "the orders status should be updated to "Completed"
assert Order.get(order1.id).status == "Completed"
assert Order.get(order2.id).status == "Completed"
assert Order.get(order3.id).status == "Completed"
assert Order.get(order4.id).status == "Completed"
}
当我在测试之前用 table 行为数据库播种并使用这些 ID 时,测试通过,现有行将被更新。该问题似乎仅在我在测试中创建 table 行时出现。但有趣的是,executeUpdate 的 return 值为 4,这意味着实际上有 4 table 行已更新,所以我有点困惑为什么状态不是实际上改变。 测试使用@Integration 和@Rollback 注释,这意味着测试事务正在回滚而不是在测试期间完全提交。但我仍然可以检索使用 Order.findById(...) 或 Order.findByDescription() 保存的订单,所以我不确定为什么这在测试期间持续存在,但不是执行更新事务。
找到解决方案。刷新似乎没有用,但清除会话确实有效,所以在测试开始时 class 为 Hibernate SessionFactory
插入一个 setterdef sessionFactory
保存对象后
sessionFactory.currentSession.clear()
这样做允许更新和检索在测试中创建的对象