如何在Grails单元测试中获取抽象域类的实例?

时间:2012-01-18 12:18:32

标签: unit-testing grails mocking gorm

我有一个带有顶级抽象类的域对象层次结构。在GORM中,它们可以这样定义:

abstract class Dog {
...
}

class Collie extends Dog {
...
}

现在我想对一个传递了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实例)。

任何提示?

1 个答案:

答案 0 :(得分:3)

因此,我提出的一个解决方案是使用元编程:

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

这不是最明显的方式,如果您在单元测试中实际使用多个子类,它可能会变得复杂,所以如果有人知道如何正确执行,请提供帮助。