由于grails 2.4.4中的IllegalStateException,无法运行集成测试

时间:2014-12-08 11:13:07

标签: grails intellij-idea integration-testing spock

我正在使用Grails 2.4.4进行申请。我为我的控制器写了一个集成测试。

class UserControllerIntegrationSpec extends IntegrationSpec {
    UserController controller = new UserController()

    void "test something"() {
        when:
        controller.request.method = 'POST'
        controller.create()

        then:
        controller.response.status == HttpStatus.OK.value()
    }
}

当我尝试使用IntelliJ运行测试时,我得到一个例外:

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)

当我使用带test-app命令的控制台运行集成测试时,没有问题。附:单元测试没有问题。

2 个答案:

答案 0 :(得分:5)

您无法像在单元测试中那样在IDE中单独运行集成测试。集成测试环境的运行速度与运行run-app的运行环境差不多,其中一个很大的区别就是没有Web服务器。

因此测试基础架构期望有一个Spring Application上下文(至少部分因此依赖注入将适用于测试类),GORM,插件等。所以你可以从IDE运行集成测试,但他们必须只需运行grails test-app并为您捕获输出,就像在IDE中运行应用程序一样。

答案 1 :(得分:0)

现在不知道这个问题,但是对上述内容进行评论,我相信我能够在intellij中单独执行集成测试。

不确定你的设置是什么,这是我的大致:

  • grails 2.4.4
  • intellij IDEA ultimate 13.1.5

重新制作的步骤:

  1. grails create-app foo(+ cd foo /)
  2. grails create-domain-class com.foo.User
  3. grails generate-restful-controller com.foo.User
  4. 试验:

    package com.foo
    
    import grails.test.spock.IntegrationSpec
    import org.springframework.http.HttpStatus
    
    class UserControllerIntegrationSpec extends IntegrationSpec {
    
        UserController controller = new UserController()
    
        void "test something"() {
            when:
            controller.request.method = 'POST'
            controller.save()
    
            then:
            controller.response.status == HttpStatus.OK.value()
        }
    
    }
    
  5. 使用ctrl + shift + f10(运行上下文配置)执行,光标位于方法中。

  6. 测试结果:

    |Running 1 integration test...
    
    |Running 1 integration test... 1 of 1
    --Output from test something--
    Failure:  |
    test something(com.foo.UserControllerIntegrationSpec)
     |
    Condition not satisfied:
    
    controller.response.status == HttpStatus.OK.value()
    ...
    

    以下是来自.idea/workspace.xml的代码段,似乎描述了测试配置:

    <configuration default="false" name="test something()" type="GrailsRunConfigurationType" factoryName="Grails">
      <module name="foo" />
      <setting name="vmparams" value="-Dgrails.full.stacktrace=true" />
      <setting name="cmdLine" value="test-app integration: &quot;com.foo.UserControllerIntegrationSpec.test something&quot; -echoOut" />
      <setting name="depsClasspath" value="false" />
      <setting name="passParentEnv" value="true" />
      <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" />
      <setting name="launchBrowser" value="false" />
      <RunnerSettings RunnerId="Run" />
      <ConfigurationWrapper RunnerId="Run" />
      <method />
    </configuration>
    

    希望这有帮助