我正在测试的服务方法如下所示
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"
}
当我在测试之前使用表行为数据库添加种子并使用这些ID时,然后测试通过,现有行将更新。该问题似乎仅在我在测试中创建表行时出现。但是有趣的是,executeUpdate的返回值为4,这意味着实际上已经更新了4个表行,因此对于状态为何实际上并未更改,我有些困惑。
该测试使用@Integration和@Rollback
注释,这意味着在测试过程中将回退测试事务,而不是完全提交测试事务。但是我仍然可以使用Order.findById(...)或Order.findByDescription()来保存已保存的订单,因此我不确定为什么在测试过程中这种情况持续存在,但对executeUpdate事务却没有。
最佳答案
找到了解决方案。刷新似乎不起作用,但是清除 session 可以起作用,因此在测试类的开头为Hibernate SessionFactory插入了一个setter。
def sessionFactory
然后保存对象之后
sessionFactory.currentSession.clear()
这样做可以更新和检索测试中创建的对象
关于hibernate - Grails 3 Integration Test executeUpdate,表行属性未更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61880675/