【问题标题】:grailsApplication not available in Domain class when running all Integration tests运行所有集成测试时,域类中的 grailsApplication 不可用
【发布时间】:2015-09-25 10:49:46
【问题描述】:

我在 Grails 中运行集成测试时遇到了问题。项目中的一个域类具有访问grailsApplication.config 属性的方法。我们对在域类中调用此方法的服务之一进行了集成测试。当使用命令自行运行测试时

grails test-app integration: com.project.MyTestSpec

测试运行良好,域类可以访问grailsApplication。但是,当整个测试套件运行时使用:

grails test-app integration

然后测试失败并出现错误

java.lang.NullPointerException: Cannot get property 'config' on null object

尝试访问grailsApplication.config 时。似乎当测试全部一起运行时,grailsApplication 没有被注入到域类中。有没有人遇到过这个问题?

根据我的阅读,这似乎是一个测试污染问题,但由于在每个集成测试中都没有进行设置,因此很难追查到问题。

【问题讨论】:

  • 您使用的是哪个版本的 Grails?

标签: grails testing integration-testing


【解决方案1】:

我在使用 grails 3 时遇到了这个问题。如果您正在测试域,则必须在测试开始时进行设置(使用 spock 进行测试):

def setup() {
        Holders.grailsApplication = new DefaultGrailsApplication()
        Holders.grailsApplication.config.property.code = '1234'
    }

【讨论】:

    【解决方案2】:

    我不确定问题是什么,但这一定是一个测试污染问题,你的任何一个测试用例都在使用元类对grailsApplication 做某事。因为这对我来说似乎很好用。

    作为一种解决方法,您可以避免使用注入的grailsApplication,而是使用Holders 类,如下所示:

    package com
    
    import grails.util.Holders
    
    class User {
    
        // def grailsApplication
    
        String email
        String name
    
        String getTitle() {
            return Holders.getConfig()["app.title.prefix"] + name
            // Or
            //return Holders.grailsApplication.config["app.title.prefix"] + name       
        }
    }
    

    这样,你就不会依赖依赖注入了。

    【讨论】:

      【解决方案3】:

      我遇到了同样的问题,发现我的集成测试实现了导致问题的 ServiceUnitTest。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-05
        • 2015-02-19
        • 2015-01-01
        相关资源
        最近更新 更多