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()

这样做允许更新和检索在测试中创建的对象