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