我们有一个简单的方法可以获取所有特定域对象,其中属性等于硬编码字符串。此方法在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
}
然后结果按预期回来。这让我相信它与集成测试中的事务有关。有什么想法吗?
答案 0 :(得分:1)
通过向failOnError: true
添加it.save(flush: true)
来验证您实际上是在保存对象,还要验证您的集成测试没有扩展GrailsUnitTestCase或其任何子类,也没有其他测试类与metaClass混淆,并没有自己清理。我怀疑交易与它有什么关系。如果已设置transactional=false
,则在测试之后,数据库中的值未更改。然后,您的保存操作出现了问题,例如验证失败。
您很少需要将集成测试设置为不包含在事务中,当您这样做时,您应该很好地理解Hibernate的会话和缓存。