【问题标题】:Flushing in integration test在集成测试中刷新
【发布时间】:2014-10-02 14:09:51
【问题描述】:

我正在尝试使用 Spock 编写集成,但由于我有一个特殊的场景,我正在努力使用休眠。基本上是这样的场景:

我在服务中有一个方法可以汇总表格中的一些信息。该服务使用 groovy.sql.Sql 类与数据库连接

def sql = new groovy.sql.Sql(dataSource)
sql.execute("insert into summary_table .... values from content_table")

然后,在集成测试中,首先我使用 build-test-data 插件在内容表中插入随机数据,使用 GORM 方法 save()

测试有时运行良好,但其他时候,似乎 content_table 中的所有数据在汇总数据时都没有完全填充,并且缺少一些行(不是全部,只有少数)。

这基本上是测试:

def "this is my failing test"() {
   given:
      100.times {
          ContentTable.build().save()
      }
   when:
       def results = myservice.summarisingContentTable()
   then:
       results.size() == 100
}

then 块更复杂,但我认为它可以解释问题。

我认为问题与休眠以及何时应该提交事务有关。有人可以帮我解决这个问题吗?

更新:我刚刚在运行 myservice.summarisingContentTable() 之前设置了一个断点,并且有时尝试了不同结果的下一个查询,因此 ContentTable 被正确填充。

ContentTable.count()//returns the proper value
sql.execute("select count(*) as total from content_table").total //returns sometimes the proper value - 1, so one content_table record is missing

【问题讨论】:

  • 不确定您是如何构建ContentTable...您是否检查了ContentTable.build().save() 不返回null 以确保构建的对象中没有错误?
  • ContentTable 正在正确填充。我正在使用 IntelliJ IDEA 和一些断点进行调试,它具有正确的值,但是在调用方法服务时出于任何原因,有时该表没有完整的内容。
  • 出于好奇:当它失败时,它会失败一个吗?还是只是一个随机数?
  • 它通常只失败一个记录,这更加疯狂。

标签: hibernate grails groovy spock


【解决方案1】:

您确定您的 ContentTable 已正确创建吗?在我的测试中,我使用这个成语:

assert myObject.save() || myObject.errors.allErrors.empty

这样,它会立即打印错误是什么,如果有的话。

其次,如果您使用的是最新的 Grails 2.4,请记住默认情况下它们不会自动刷新。查看文档如何更改它,或保存(flush:true)。

【讨论】:

  • 是的,它们是正确创建的。我认为问题在于使用休眠正确刷新。
  • 在我想不出一个好的理由的情况下,我使用的一种技术涉及到深入调试整个 hibernate save(flush:true) 调用。例如,我曾经发现 hibernate 会悄悄地忽略某些属性,因为它们没有正确映射,这给了它们一些指示符,后来通过一些 if() 使 hibernate 忽略它们。这确实需要一段时间,但它非常强大,可以发现一个人的错误以及 grails 的未记录甚至错误行为。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-12
  • 1970-01-01
  • 1970-01-01
  • 2018-08-09
  • 1970-01-01
相关资源
最近更新 更多