【问题标题】:How to access grailsApplication and ApplicationContext in Functional Tests如何在功能测试中访问 grailsApplication 和 ApplicationContext
【发布时间】:2013-09-04 13:14:39
【问题描述】:

我正在构建一个 Grails REST 应用程序,并且我已经使用 Spock 编写了我的功能测试。 请注意,这些功能测试仅适用于 REST 服务。

class LoginFunctionalSpec extends Specification {
  def setUp() {
    // here I want to access grailsApplication.config
  }
}

我已经尝试了以下方法:

  1. 注入 grailsApplication(通过定义为类级别变量),但没有注入任何内容。
  2. 使用 ApplicationHolder.application.config 但它已被弃用,建议的方法是前一点。
  3. 尝试使用插件远程控制:1.4,但尽管 grails 控制台显示插件已安装,但我没有找到 RemoteControl 类。我也不确定这种方法
  4. 我尝试将 grails-app/conf/Config.groovy 作为文件读取(如 here 所述),但得到了 FileNotFoundException。

但它们都没有在我的功能测试中提供 grailsApplication.config。

有什么办法可以做到吗?

更新

@dmahapatro

我没有使用 Geb,因为我正在测试 REST 服务并且不需要浏览器自动化。

正如我在第 1 点所说的 grails 应用程序没有被自动注入。

class LoginFunctionalSpec extends Specification {
  def grailsApplication

  def setUp() {
     def port = grailsApplication.config.mongo.port //throws NPE
  }
}

它抛出一个 NPE 说正在对空对象调用配置属性。

【问题讨论】:

    标签: grails functional-testing spock applicationcontext grails-config


    【解决方案1】:

    我认为您不需要显式注入任何内容。 grailsApplication 默认在测试中可用。

    class LoginFunctionalSpec extends Specification {
      def setUp() {
         grailsApplication.config.blah //should work
      }
    }
    

    注意-
    Spock 不提供对功能测试的直接支持。您需要使用Geb 进行正确的功能测试。

    【讨论】:

    • 我根据您的建议更新了描述。 (在我的情况下不需要 Geb,自动注射不起作用)
    • @ssinghal 我的意思是你不需要def grailsApplication。默认情况下可用于测试。
    • @ssinghal 您需要@TestFor 才能使用规范中的默认grailsApplication
    【解决方案2】:

    您是在集成测试阶段还是功能测试阶段运行测试?

    您需要从 IntegrationSpec 扩展以在集成测试阶段进行自动装配,但您在这里谈论的是功能测试...因为 grails 在与被测应用程序相同的 JVM 中运行您的测试,所以您并不真正需要使用 RemoteControl,但我总是在我的功能测试中使用它,因为它对我来说似乎更干净,并且如果您的测试和被测应用程序不在同一个 JVM 中运行,它是一种非常强大的技术。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-21
      • 2014-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-23
      • 2020-03-09
      相关资源
      最近更新 更多