0

核心

Build Test Dataプラグインを介してMyDomainObject.build()を呼び出すと、単体テストで次のエラーが発生します。

例外

            groovy.lang.MissingMethodException: No signature of method: us.maponline.pesticide.PesticideProfile.addToApplicators() is applicable for argument types: (us.maponline.pesticide.PesticideApplicator) values: [us.maponline.pesticide.PesticideApplicator : null]
            Possible solutions: getApplicators()
                at grails.buildtestdata.handler.NullableConstraintHandler.addInstanceToOwningObjectCollection(NullableConstraintHandler.groovy:121)
                at grails.buildtestdata.handler.NullableConstraintHandler.populateDomainProperty(NullableConstraintHandler.groovy:88)
                at grails.buildtestdata.handler.NullableConstraintHandler.handle(NullableConstraintHandler.groovy:17)
                at grails.buildtestdata.DomainInstanceBuilder.createMissingProperty(DomainInstanceBuilder.groovy:187)
                at grails.buildtestdata.DomainInstanceBuilder.populateInstance(DomainInstanceBuilder.groovy:147)
                at grails.buildtestdata.DomainInstanceBuilder.build(DomainInstanceBuilder.groovy:124)
                at grails.buildtestdata.DomainInstanceBuilder.build(DomainInstanceBuilder.groovy:123)
                at grails.buildtestdata.BuildTestDataService$_addBuildMethods_closure1.doCall(BuildTestDataService.groovy:25)
                at us.maponline.pesticide.PesticideLogServiceTests.testSaveLog(PesticideLogServiceTests.groovy:20)
            | Completed 1 unit test, 1 failed in 5289ms

スタックトレースによると、これはbuildtestdataプラグインコード内で発生しています。PesticideProfileクラスに追加されているとき、私のクラスPesticideApplicatorはnullのようです。

PesticideProfileに渡されたときに、ビルドを要求しているクラスがnullになる可能性はありますか?

ソースコード

テストケース

            @TestFor(PesticideLogService)
            @Build([PesticideLog,PesticideApplicator,PesticideProfile])
            class PesticideLogServiceTests
            {
                void testSaveLog() {

                    PesticideApplicator applicator = PesticideApplicator.build()

                    def result = service.createLog(applicator, new Date())

                    result.errors.each {
                        log.info "got an error. field = $it.field, message:$it.defaultMessage, rejected value = $it.rejectedValue "
                    }

                    assert result: 'no result returned'
                    assert result.success: 'save failed'
                    assert result.result instanceof PesticideLog: "result was not PesticideLog"

                    assert applicator.user.pesticideLogs.size() > 0 : 'expected at least on log to be created.'

                }

            }

PesticideProfileLog

            class PesticideProfile
            {

                def User user
                String companyName

                static constraints = {
                }

                static belongsTo = User
                static hasMany = [sites: PesticideSite, applicators: PesticideApplicator]

            }

農薬アプリケーター

            class PesticideApplicator
            {

                String firstName
                String lastName
                String company
                PesticideApplicatorLicense licenseType
                Phone phoneNumber

                static belongsTo = [profile:PesticideProfile]

                static constraints = {
                    company blank: false, maxSize: 55
                    firstName blank: false, maxSize: 55
                    lastName blank: false, maxSize: 100
                    phoneNumber nullable: true
                }

                static mapping = {
                    licenseType length: 55
                }

                def getUser(){
                profile?.user
            }

            }

ご協力ありがとうございます!

4

1 に答える 1

3

この問題は、ビルドテストデータプラグインがPesticideApplicatorでユーザーの値を設定しようとしたことが原因で発生します。問題は、getUser()がフィールドではなく、単なるユーティリティヘルパーであるということです。

   ...
   def getUser(){
     profile?.user
   }
   ...

解決した問題getUser()から削除します。PesticideApplicator

そうは言っても、ユーザーにアクセスするためのヘルパーメソッドが必要です(コードに別のクラスの内部について知らせないのは良いことです)。メソッド@Transientのマーク付けは機能しませんでした。エラーはまだ表示されました。メソッドの名前を変更する以外に、このゲッターを無視するようにビルドテストデータプラグインに指示するにはどうすればよいですか?

ありがとう!

于 2012-06-02T01:11:40.340 に答える