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を持つ基本タイプです。サブクラスに設定された識別子の値を取得するプロパティを公開しました。ApplePeartype

これでJsonExportService、インスタンスを JSON データとしてエクスポートする ができました。アプリケーションを実行しているとき、このサービスは識別子の値が入力されたtypeプロパティを正しくエクスポートします。

の単体テストを作成する必要がありJsonExportServiceます。問題は、GrailsDomainBinder単体テストでモックアウトされていないようで、NPE: cannot access discriminatorproperty on a null object を取得していることです。

次の 2 つの方法で回避できます。

  1. ディスクリミネータと同じ値を持つ各サブクラスに静的プロパティを作成します。

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

    これは非常にハックに思えますが、2 つの場所で同じ値を宣言しています。

  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 に答える