次のようなサブクラスがたくさんあります。
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: cannot access discriminator
property on a null object を取得していることです。
次の 2 つの方法で回避できます。
ディスクリミネータと同じ値を持つ各サブクラスに静的プロパティを作成します。
class Pear extends Fruit { static String type = 'Pear' ... }
これは非常にハックに思えますが、2 つの場所で同じ値を宣言しています。
getType()
コードを次のように変更します。GrailsDomainBinder.getMapping(this.class)?.discriminator
これは機能しますが、現在は基本的にディスクリミネーターを完全に無視しており、
getType()
メソッドが正しい値を返すことを確認するためにフォローアップ統合テストが必要なため、単体テストは「完全」ではありません。
ドメイン マッピングから識別子の値を取得する、単体テストに適したより良い方法を知っている人はいますか?