从Resources.groovy注入Spring Beans到Grails 3服务的集成测试

时间:2016-07-28 23:05:00

标签: grails spock

我正在尝试为注入了spring bean的服务编写集成测试。 spring bean在resources.groovy中定义。我的服务使用的bean似乎没有在我的集成测试中注入,但是当我运行grails run-app时,它会被正常注入。

这是一个最小的失败示例:

grails-app/conf/spring/resources.groovy

beans = {
  myBean(Object){}
}

grails-app/services/MyService.groovy

class MyService {
  def myBean

  def serviceMethod(){
    myBean.class.simpleName
  }
}

grails-app/src/integration-test/groovy/MyServiceSpec.groovy

@Integration
class MyServiceSpec extends Specification {
  def myService

  when:
  def myBean = myService.myBean

  then:
  myBean != null
}

Grails版本信息:

$ grails -v
| Grails Version: 3.1.9 
| Groovy Version: 2.4.7
| JVM Version: 1.8.0_92

更新

Spring似乎注入其他服务就好了。如果我在MyService内声明了另一个服务,它会被注入。

class MyService {
  def myBean
  def myOtherService

  def serviceMethod(){
    myBean.class.simpleName
  }
}

2 个答案:

答案 0 :(得分:0)

我可能迟到了这个...但是,对于未来的读者,请尝试在grails.gorm.autowire

中设置trueapplication.yml

答案 1 :(得分:-2)

你的例子有很多奇怪的东西,例如

beans = {
  myBean(Object){}
}

我无法想象你为什么要创建一个Object类型的bean,但这可能是为了示例的目的而进行的简化,而真正的bean有不同的类型。

@Integration
class MyServiceSpec extends Specification {
  def myService

  when:
  def myBean = myService.myBean

  then:
  myBean != null
}

此测试归结为测试依赖注入是否有效,这意味着您测试Spring / Grails而不是您自己的代码。这不是你应该测试IMO的东西。

无论如何要解决您的问题,我认为您只需要添加@Autowired注释

import org.springframework.beans.factory.annotation.*

@Integration
class MyServiceSpec extends Specification {

  @Autowired
  def myService

  when:
  def myBean = myService.myBean

  then:
  myBean != null
}