集成测试中的Grails作用域服务

集成测试中的Grails作用域服务,grails,scope,integration-testing,Grails,Scope,Integration Testing,我有一项服务需要范围“会话”。所以我就用 class MyService { static scope = "session" ... } 但在我的集成测试中,它没有正确连接: class MyServiceIntegrationSpec extends IntegrationSpec { def myService ... } 我总是会出错: 创建名为“myService”的bean时出错:作用域“session”对于当前线程不是活动的;如果您打算从单元引用这个bean,请

我有一项服务需要范围“会话”。所以我就用

class MyService {
  static scope = "session"
  ...
}
但在我的集成测试中,它没有正确连接:

class MyServiceIntegrationSpec extends IntegrationSpec {
  def myService
  ...
}
我总是会出错:

创建名为“myService”的bean时出错:作用域“session”对于当前线程不是活动的;如果您打算从单元引用这个bean,请考虑为它定义一个作用域代理;p>
我做错了什么?

您不能将“较低”范围的bean注入singleton。就像您希望将控制器注入服务一样。控制器随每个请求一起创建,但服务是应用程序的服务(如果默认为单例)。在这里,您可以有不同的会话,但只有一个用于测试的单例,所以您希望在测试中使用哪个会话的服务

可以从上下文中获取bean,而不是注入它:

def grailsApplication

void testSomething() {
    given:
    def myService = grailsApplication.mainContext.getBean('myService')
...
将测试范围从单例更改为会话也可以解决问题,但我不知道这是否可行