2011-09-20 82 views
0

我们有一个简单的方法,可以获取属性等于硬编码字符串的特定域对象的所有特定对象。此方法在MyDomainService中。Grails Criteria不能在集成测试中工作

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 

,留下我的代码不变。我尝试将事务设置为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 
} 

然后结果如预期地回来。这使我相信它与集成测试中的事务有关。有任何想法吗?

+0

你并不十分清楚结果会如何回归。 –

回答

1

确认您实际上拯救的对象加入failOnError: trueit.save(flush: true),也验证您的集成测试是不延长GrailsUnitTestCase或任何它的子类并没有其他的测试类与元类混乱和没”不要自行清理。我怀疑这笔交易与此有任何关系。如果您已设置transactional=false,并且在测试后数据库中的值未更改。然后,保存操作出现问题,例如验证失败。

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

+0

我总是忘记验证只涉及很多事情。将failOnError设置为true向我显示了问题(源自某人添加inList:到我们的域对象) – Joseph

+0

另外,我将验证放在错误的地方。第二次保存在我的测试中证明是正确的,但第一次失败。再次感谢 – Joseph

+0

我会在你的config.groovy设置中推荐'grails.gorm.failOnError = true',然后处理你不希望它成立的特定情况。 –