0

私はこのドメインクラスを持っていますWardname私がテストしたいこの制約があります(medi_absパッケージWardはどこにありますか):

package medi_abs

class Ward {

    String name
    static constraints = {
        name blank:false
    }
}

今のところ、WardTests.groovy は次のようになります。

package medi_abs

@TestFor(Ward)
@Mock(Ward)

class WardTests {
    void testInstance() {
        def wardx = new Ward(name: 'OP')
        assertEquals 'OP', wardx.name
    }
    void testConstraints() {
        mockForConstraintsTests(Ward)
        def wardx = new Ward(name: 'OP')
        assertTrue wardx.validate()
    }
}

コマンドを実行するとtest-app Ward、testInstance は失敗しませんが、testConstraints は失敗し、その後に次のエラー メッセージが表示されます。

groovy.lang.MissingPropertyException: No such property: validate for class: medi_abs.WardTests at medi_abs.WardTests.testConstraints

[編集: エラー メッセージは次のとおりです。なぜ変更されたのかわかりません: ]

java.lang.NullPointerException
at grails.test.MockUtils$_addValidateMethod_closure87.doCall(MockUtils.groovy:1022)
at grails.test.MockUtils$_addValidateMethod_closure88.doCall(MockUtils.groovy:1065) 
at medi_abs.WardTests.testConstraints(WardTests.groovy:43)

最初のメソッドでWardは適切にインスタンス化されているようですが、validate() コマンドに関連してwardxnull です。これまでに良い例を見つけることができませんでした。validate() を間違って使用していますか? それとも、Grails で制約をテストするより良い方法はありますか?

4

1 に答える 1

5

@TestForアノテーションを使用する場合@Mock、ドメイン クラスに追加する必要はありません。@Mock関連付けの場合、または他の成果物 (コントローラーなど) の単体テストを実行している場合にのみ必要です。

また、モック メソッドの割り当てはvoid mockForConstraintsTests(Class clazz, List instances = [])であるため、準備するインスタンスのリストを渡す必要があります。

したがって、コードは次のようになります。

package medi_abs

@TestFor(Ward)
class WardTests {
    void testInstance() {
        def wardx = new Ward(name: 'OP')
        assertEquals 'OP', wardx.name
    }
    void testConstraints() {
        def wardx = new Ward(name: 'OP')
        mockForConstraintsTests(Ward, [wardx])
        assertTrue wardx.validate()
    }
}
于 2013-09-18T20:57:51.527 に答える