在Grails中,如何在单元测试中模拟GrailsDomainBinder?

时间:2012-12-07 02:02:03

标签: grails discriminator grails-2.0.4

我有一堆像这样的子类:

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()方法返回正确的值

  3. 有没有人知道从域映射中获取鉴别器值的更好的,单元测试友好的方法?

1 个答案:

答案 0 :(得分:0)

似乎DefaultGrailsDomainConfiguration负责初始化映射,因此您可以尝试:

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