Grails Criteria在Integration Test中不起作用

时间:2011-09-20 19:59:22

标签: hibernate spring grails groovy transactions

我们有一个简单的方法可以获取所有特定域对象,其中属性等于硬编码字符串。此方法在MyDomainService中。

def List<MyDomain> getAllDomain()
{
    List resultList
    def criteria = MyDomain.createCriteria()
    resultList = criteria.list()
    {
       eq('property1', 'READY')
    }
    return resultList
 }

我们也在为这种方法编写一个简单的集成测试。测试如下。

void testGetAllDomain()
{
     List original = MyDomain.list()
     original.each{
        it.property1 = 'NOTREADY'
        it.save(flush:true)
     }

     def result = MyDomainService.getAllDomain()
     assertEquals 0, result.size()  //All objects should be set to NOTREADY, and not retrieved.  THIS is failing.

}

我尝试过设置

def transactional = false

并保留我的代码。我尝试将transactional设置为false并将代码包装在.withTransaction {}中。我也尝试了标准配置,但没有用。我注意到的是,如果我做了

def List<MyDomain> getAllDomain()
{
   List original = MyDomain.list()
    original.each{
      it.property1 = 'NOTREADY'
      it.save(flush:true)
    }
   List resultList
   def criteria = MyDomain.createCriteria()
   resultList = criteria.list()
   {
      eq('property1', 'READY')
   }
   return resultList
 }

然后结果按预期回来。这让我相信它与集成测试中的事务有关。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

通过向failOnError: true添加it.save(flush: true)来验证您实际上是在保存对象,还要验证您的集成测试没有扩展GrailsUnitTestCase或其任何子类,也没有其他测试类与metaClass混淆,并没有自己清理。我怀疑交易与它有什么关系。如果已设置transactional=false,则在测试之后,数据库中的值未更改。然后,您的保存操作出现了问题,例如验证失败。

您很少需要将集成测试设置为不包含在事务中,当您这样做时,您应该很好地理解Hibernate的会话和缓存。