2013-05-13 21 views
8

我使用分配的ID在我的域名Grails的,具有分配的id

class Book { 

Integer id 
String name 

static mapping = { 
    id generator: 'assigned' 
    } 
} 

所以要加一本新書的單元測試模擬域:

def book = new Book([name: "The Adventures of Huckleberry Finn"]) 
book.id = 123 
book.save(flush: true) 

一切完美,問題是在我單元測試

首先我只能模擬1個域類,其次我不能在單元測試中使用.save(),所以我唯一的選擇(據我所知)是使用mockDomain如下:

mockDomain(Book, [ [id: 123, name: "The Adventures of Huckleberry Finn"] ]) 

,但它不能正常工作,它會在不正常域工作「的id生成:‘分配’」

什麼想法? 我讀,我不會面對綜合測試這個問題, 感謝

回答

8

只是在單元測試中的一個問題,如果你想使用(默認情況下idbindable)你將需要bindable約束的id它作爲映射參數在單元測試中創建域對象。域名類需要有意見的

static constraints = { 
    id bindable: true 
} 

詞:
如果您在使用Grails> 2.x中,使用@Mock到模擬域類,而不是mockDomain。你可以在Grails文檔中找到關於Unit Testing的詳細信息。

另一個結果Level Up
使用build-test-data插件來模擬域對象。

+0

感謝,將嘗試綁定:真實, 爲@Mock,正如我所說,我只能在測試文件莫克1個域,所以如果我需要模擬超過1,我必須使用mockDomain,除非有其他方法來模擬多個域,我不知道 – iMiX 2013-05-14 16:22:08

+4

'@Mock([Domain1,Domain2,Domain3,.....])' – dmahapatro 2013-05-14 17:01:06

2

該解決方案能夠滿足我的需求:

Book mockBook = [name: "The Adventures of Huckleberry Finn"] as Book 
mockBook.metaClass.id = 123 
assert mockBook.id == 123