2

我有一堆像这样的子类:

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: cannot access discriminatorproperty on a null object。

我可以通过两种方式解决它:

  1. 在每个子类中创建一个与鉴别器具有相同值的静态属性:

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

    不过,这似乎真的很老套,我在两个地方声明了相同的值。

  2. getType()将代码更改为:

    GrailsDomainBinder.getMapping(this.class)?.discriminator
    

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

有谁知道从域映射中获取鉴别器值的更好的、单元测试友好的方法?

4

1 回答 1

0

似乎这DefaultGrailsDomainConfiguration是初始化映射的责任,因此您可以尝试:

def domainClass = grailsApplication.getDomainClass(Pear.class.name)
DefaultGrailsDomainConfiguration.configureDomainBinder(grailsApplication, [domainClass] as Set)
println GrailsDomainBinder.getMapping(Pear)
于 2012-12-07T17:19:37.200 回答