2012-12-07 134 views
2

我有像这样一堆子类:在Grails中,我如何在单元测试中模拟GrailsDomainBinder?

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是碱型与ApplePear作为亚型。我公开了一个type属性,该属性获取在子类中设置的鉴别器值。

现在我有一个JsonExportService将实例导出为JSON数据。当我运行应用程序时,此服务正确导出填充了鉴别器值的type属性。

我现在需要编写一个单元测试JsonExportService。问题是,GrailsDomainBinder似乎没有在单元测试中被嘲笑,而且我得到了NPE:无法访问空对象上的discriminator属性。

我可以解决它在两个方面:

  1. 创建具有相同的值作为鉴别每个子类的静态属性:

    class Pear extends Fruit { 
        static String type = 'Pear' 
        ... 
    } 
    

    这似乎真的哈克不过,和我在两个地方宣布了相同的价值。

  2. 更改getType()代码:

    GrailsDomainBinder.getMapping(this.class)?.discriminator 
    

    这工作,但现在我基本上忽略了鉴别完全和单元测试是不是“完整的”,因为它需要后续集成测试以确保getType()方法返回正确的值。

有谁知道从域映射得到鉴别价值的更好,单元测试友好的方式?

回答

0

看来DefaultGrailsDomainConfiguration是负责初始化的映射,所以你可以尝试:

def domainClass = grailsApplication.getDomainClass(Pear.class.name) 
DefaultGrailsDomainConfiguration.configureDomainBinder(grailsApplication, [domainClass] as Set) 
println GrailsDomainBinder.getMapping(Pear) 
相关问题