2011-09-20 55 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',然後處理你不希望它成立的特定情況。 –