Как получить экземпляры абстрактного класса домена в модульных тестах Grails? - PullRequest
1 голос
/ 18 января 2012

У меня есть иерархия объектов домена с абстрактным классом верхнего уровня.В GORM они могут быть определены следующим образом:

abstract class Dog {
...
}

class Collie extends Dog {
...
}

Теперь я хотел бы провести модульное тестирование контроллера, который получает идентификатор собаки, например:

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

Есть какие-нибудь подсказки?

1 Ответ

3 голосов
/ 18 января 2012

Итак, одним из решений, которое я нашел, было использование метапрограммирования:

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

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

...