2012-01-18 51 views
1

我有一個頂級抽象類的域對象層次結構。在GORM,他們可以這樣定義:如何在Grails單元測試中獲取抽象域類的實例?

abstract class Dog { 
... 
} 

class Collie extends Dog { 
... 
} 

現在我想進行單元測試,其被傳遞一個狗ID控制器,就像這樣:

//in the unit test 
new Collie(id:1).save(validate:false) 
params.id = 1 
controller.show() 

//in the tested controller 
def dog = Dog.get(params.id) 

這適用於真正的GORM,遺憾的是沒有任何東西會被測試GORM實現返回,因爲我不能使用@Mock(Dog)mockDomain(Dog)(這樣做會返回一個異常,因爲Dog是抽象的),而@Mock(Collie)是不夠的(即使實際的嘲笑對象實際上是一個牧羊犬實例)。

任何提示?

回答

3

所以,一個解決方案,我想出了工作使用元編程:

Dog.metaClass.static.get = { Long id -> 
    return Collie.get(id) 
} 

這還不是最明顯的方式,它可以變得很複雜,你實際上是在單元測試中使用超過一個小類,所以如果有人知道如何正確地做,請捐助。