Grails构建测试数据插件 - 调用DomainObject.build()时出现MissingMethodException

时间:2012-06-01 19:56:09

标签: grails grails-plugin

The Crux

通过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插件代码中。当我的类PesticideApplicator被添加到PesticideProfile类时,它似乎是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]

            }

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
            }

            }

感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

问题是由构建测试数据插件尝试在PesticideApplicator中设置用户的值引起的。问题是getUser()不是一个字段,它只是一个实用程序帮助程序:

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

getUser()删除PesticideApplicator解决了问题。

那就是说,我仍然想要一个帮助方法来访问用户(最好不要让我的代码知道另一个类的内部)。标记方法@Transient不起作用;错误仍然出现。如果没有重命名方法,我怎样才能指示构建测试数据插件忽略这个getter?

谢谢!