2012-01-18 6 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) недостаточно (хотя фактический издеваемый объект на самом деле является экземпляром Collie).

Любые подсказки?

ответ

3

Так одно решение я придумал, что работал использует мета-программирования:

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

Это не самый очевидный способ, и это может усложниться, где вы на самом деле использовать более одного подкласса в модульных тестов , поэтому, если кто-то знает, как правильно это сделать, внесите свой вклад.