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 插件代码中。似乎我的类 PesticideApplicator 在添加到 PesticideProfile 类时为空。

当传递给 PesticideProfile 时,我要求构建的类怎么可能为空?

源代码

测试用例

            @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.'

                }

            }

农药概况日志

            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 不起作用;错误仍然出现。没有重命名方法,我如何指示构建测试数据插件忽略这个getter?

谢谢!

于 2012-06-02T01:11:40.340 回答