我有一堆像这样的子类:
abstract class Fruit {
...
String getType() {
// get the discriminator value for this type
GrailsDomainBinder.getMapping(this.class).discriminator
}
}
class Apple extends Fruit {
static mapping = {
discriminator 'Apple'
}
}
class Pear extends Fruit {
static mapping = {
discriminator 'Pear'
}
}
换句话说,Fruit
是基本类型,其中Apple
和Pear
为子类型。我公开了一个type
属性,它获取了在子类中设置的鉴别器值。
现在我有一个JsonExportService
将实例导出为JSON数据。当我运行应用程序时,此服务正确导出使用鉴别器值填充的type
属性。
我现在需要为JsonExportService
编写单元测试。问题是,GrailsDomainBinder
似乎没有在单元测试中被模拟,我得到了NPE:无法访问空对象上的discriminator
属性。
我可以通过两种方式解决这个问题:
在每个子类中创建一个与鉴别器具有相同值的静态属性:
class Pear extends Fruit {
static String type = 'Pear'
...
}
这看起来真的很烂,而且我在两个地方宣布相同的价值。
将getType()
代码更改为:
GrailsDomainBinder.getMapping(this.class)?.discriminator
这有效,但现在我基本上完全忽略了鉴别器,单元测试不是'完整',因为它需要进行后续集成测试以确保getType()
方法返回正确的值
有没有人知道从域映射中获取鉴别器值的更好的,单元测试友好的方法?
答案 0 :(得分:0)
似乎DefaultGrailsDomainConfiguration
负责初始化映射,因此您可以尝试:
def domainClass = grailsApplication.getDomainClass(Pear.class.name)
DefaultGrailsDomainConfiguration.configureDomainBinder(grailsApplication, [domainClass] as Set)
println GrailsDomainBinder.getMapping(Pear)