&引用;找不到ApplicationContext,请先正确配置Grails“;

&引用;找不到ApplicationContext,请先正确配置Grails“;,grails,testing,integration,Grails,Testing,Integration,我们有一个插件项目与一些领域类和服务等。 我们有一个使用插件项目的应用程序项目。 这是一种常见的模式。 集成测试(命中DB)不能在插件项目中运行,因为它没有应用程序上下文,所以我们在主应用程序项目中运行集成测试 我们有一个非常简单的集成测试: /*@TestFor(Site)*/ class SiteIntegrationSpec extends IntegrationSpec { static transactional=false; def setup() { }

我们有一个插件项目与一些领域类和服务等。 我们有一个使用插件项目的应用程序项目。 这是一种常见的模式。 集成测试(命中DB)不能在插件项目中运行,因为它没有应用程序上下文,所以我们在主应用程序项目中运行集成测试

我们有一个非常简单的集成测试:

/*@TestFor(Site)*/
class SiteIntegrationSpec extends IntegrationSpec {
    static transactional=false;
    def setup() {
    }
    def cleanup() {
    }
    void "test something"() {
        Site site

        when:
        site = Site.get(1L)

        then:
        site.name == "root"
    }
}
站点只是一个域对象,与此类似:

class Site {
    String name    
    // some more fields here
}
注意:使用TestFor(Site)进行了尝试,也未注释-相同的错误

如果我查看数据库,那里有站点条目

好的,刚刚找到另一条线索。SiteIntegrationSpec测试用于工作。在我们添加第二个测试ParamIntegrationSpec之前,它已经工作了。如果我们单独运行这些测试中的任何一个:

test-app --stacktrace --verbose ParamIntegrationSpec
工作

工作

但如果我们同时运行它们:

test-app --stacktrace --verbose *IntegrationSpec
SiteIntegrationSpec测试始终失败,出现上述异常

有什么想法吗

完整堆栈跟踪:

java.lang.IllegalStateException: Could not find ApplicationContext, configure Grails correctly first
at grails.util.Holders.getApplicationContext(Holders.java:97)
at grails.test.spock.IntegrationSpec.$spock_initializeSharedFields(IntegrationSpec.groovy:41)
注2:

test-app --stacktrace --verbose -integration

在现场测试中给出了相同的错误。

感谢用户1690588,我发现了问题。给了我线索:问题不在失败的测试中,而在通过的测试中

基本上,ParamIntegrationSpec测试具有:

@TestFor(ParamService)
这将终止任何后续测试。我不知道TestFor做什么,只在所有示例中看到了它


要解决这个问题,只需将该行从工作测试中删除。

我不知道为什么会发生这种情况,但其他规范正在做一些污染其他规范的事情。还可以尝试这样做:这是一个很好的例子,说明了为什么copypasta不是一个有效的开发策略:)
@TestFor
是一个单元测试注释,它混合到类的假行为中,以获得单元测试环境,其中没有真正的Spring/Hibernate/(大多数)插件/等等,看起来有点像集成测试和运行应用程序环境。您不应该(从逻辑上)混合使用单元测试代码和集成测试代码,但您可以看到它也会对您的测试产生负面影响。更糟糕的是,它可能会导致误报。TestFor for testing services会带来这个问题,但对于测试控制器,它会注入控制器变量,并在集成测试中对其进行实例验证。如果没有使用,则需要手动创建控制器实例。因此它有点复杂,Grails文档在如何测试控制器和服务以及单元与集成方面不是很好/完整。
@TestFor(ParamService)