【问题标题】:Grails - How to inject bean defined in resources.groovy in integration testGrails - 如何在集成测试中注入 resources.groovy 中定义的 bean
【发布时间】:2014-04-17 14:00:20
【问题描述】:

我在 resources.groovy 中定义了 1 个 bean

cachedbean(serviceImpl) {
  }

在服务中我就是这样使用的

    MyService{

      static transactional = false
      def cachedbean

        myMeth(){
         cachedbean.get("cacheKey")
      }
   }

这很好,但是当我尝试使用集成测试对其进行测试时,我在“get”上得到了nullpointer 异常 cachedbean.get("cacheKey").

它是如何工作的?

【问题讨论】:

    标签: grails integration-testing


    【解决方案1】:

    如果您让 Grails 将服务 bean 自动连接到您的集成测试类中,它应该是自动连接的,而不是“新建”服务实例。

    class MyServiceTests extends GroovyTestCase {
        def myService
        void testSomething () {
            // myService should already be wired up
        }
    }
    

    【讨论】:

      【解决方案2】:
      1. 根据您的示例代码,不清楚您是否这样做,但您需要在 resources.groovy 中完全限定“serviceImpl”的包和类名称,除非您明确导入包。

      2. 您可能需要在resources.groovy 的声明范围内添加bean.autowire = "byName"

      【讨论】:

      • 1) 我为 serviceImpl 添加了完全限定名称。 2)它在代码中工作,但仅在集成测试中失败。那么显式添加会影响吗?
      • 添加bean.autowire = "byName" 不应该对任何事情产生负面影响。不过,我只是有一个想法:您是在引用这项服务吗?意思是,您是在测试另一个调用这个服务的服务吗?如果是这样,那么 Spring 还不够聪明,无法知道注入此服务,毕竟您可能需要您的测试手动为 cachedBean 分配一个值。
      • 没有。我是直接调用这个服务方法的。
      • 您是如何在测试中获得对MyService 的引用?
      • 完全限定 resourcs.groovy 中的类名一定不是问题,因为 OP 声明布线在正在运行的应用程序中有效,而 Grails 默认使用名称自动装配,因此没有理由指定在这里(同样,接线在正在运行的应用程序中工作)。
      猜你喜欢
      • 2016-12-03
      • 1970-01-01
      • 1970-01-01
      • 2013-01-03
      • 1970-01-01
      • 2023-04-04
      • 2017-03-08
      • 2012-05-04
      • 1970-01-01
      相关资源
      最近更新 更多