2016-12-15 4 views
1

Grails 3で何らかのクラスの単体テストを書くときに、@TestForという注釈を使ってテストしたいクラスを指定することができます。私の単体テストでは、もし私がサービスをテストしているなら、私のクラスがコントローラで、フィールドが "サービス"であればフィールド "コントローラ"があり、これらのフィールドを "テスト中のシステム"として使うことができます。@TestForはドメインの単体テストで何をしますか?

@TestForがドメインクラスのテストでどのように働いているのか、どのように使用されているのでしょうか。私はこの事件を扱う文書を見つけることができませんでした。

@TestFor(MyDomain) 
class MyDomainSpec extends Specification { 

    def setup() { 
     def doesntMatter = domain // just to check access to "domain" 

最後の行はすでに私に

org.codehaus.groovy.runtime.typehandlingを与える:のは、私はドメイン「のMyDomain」と、このように起動するテスト「MyDomainSpec」を持っているとしましょう。 GroovyCastException:クラスにクラスのjava.lang.Classの 'で「クラスのMyDomainを」オブジェクトをキャストすることはできませんおそらく、Grailsのは、このクラスのインスタンスとしてMyDomainのクラスを表すオブジェクトを使用しようとしていることを意味し「MyDomainの」

。私はなぜこれが起こっているのだろうと、コードに何が間違っているのだろうか?つまり、domainプロパティが存在し、その理由がありますか、そうではありませんか?単にアクセスするときに例外をスローするプロパティを使用するにはどうすればよいですか?

更新
どうやら例外は、ドメインクラスがそれにフィールドString nameを持っている場合のみスローされます。私はこの分野について何が特別であるべきかについて何の手がかりも持っていません。それは単にバグでしょうか?

+0

これは役に立つ記事のようです。彼らは '@ TestFor'をドメインクラスで使用しています。http://www.christianoestreich.com/2012/11/domain-constraints-grails-spock-updated/ – zero01alpha

+1

@ zero01alphaこれは興味深い読んだものです。ありがとうございます。しかし、TestForに関しては、彼らはメソッド "mockForConstraintsTests"を利用可能にすることだけを述べています。 – Matthias

答えて

2

@TestFor注釈は、Grailsドメインクラスに対していくつかのことを行いますが、最も重要なことは、ドメインの動作とGORM機能をモックし、ドメインクラスのインスタンスを返すゲッターを提供することです。

ドメインクラスはプロトタイプのSpring Beanとして登録されているため、ゲッターはアプリケーションコンテキストに新しいインスタンスを要求し、そのインスタンスを後でゲッターを呼び出すときに返されるプライベート$domainフィールドに設定します。 def doesntMatter = domainはこの生成されたゲッターを使用しており、def doesntMatter = getDomain()に相当します。getDomain()MyDomainの新しいインスタンスを返します。

あなたの前提が正しいと思われます。 getterを呼び出しても例外は発生しません。以下では正常に動作します:

@TestFor(MyDomain) 
class MyDomainSpec extends Specification { 

    void "a new domain can be saved"() { 
     given: "a new instance of MyDomain" 
     def d = domain // or getDomain() 

     expect: 
     d.id == null 

     when: 
     d.save() 

     then: 
     d.id != null 
    } 
} 

@Entity 
class MyDomain { 

} 

EDIT: これは、Grailsのバグに関連していたとhttps://github.com/grails/grails-core/issues/10363を参照してください、次のリリースで修正されなければなりません。

+0

ありがとう!あなたのコードは私のためにも機能します。 「getterは、リクエストされるたびに新しいインスタンスをアプリケーションコンテキストに問い合わせるだけです」と確信していますか?私のデバッガはそうでなければ私に言います - 私はドメインまたはgetDomainの連続した使用法のために同じインスタンスを取得します。 CastExceptionについて:MyDomainに "String name"フィールドがあると、明らかに起こります。奇妙な... – Matthias

+0

申し訳ありません、私の間違い。プライベート '$ domain'フィールドがnullでない場合、getterはアプリケーションコンテキストから新しいインスタンスを要求します。したがって、明示的に '$ domain = null'を設定しない限り、同じインスタンスを取得します。 – dpcasady

+0

私は 'String名 'でも' GroovyCastException'を見ています。私は理由を理解しようとします。 – dpcasady

関連する問題