Grails集成测试中的依赖注入

Grails集成测试中的依赖注入,grails,integration-testing,Grails,Integration Testing,我正在测试我的应用程序的一个服务,它在运行时依赖于另一个服务。测试时,依赖项注入似乎不起作用。在运行集成测试时,依赖项注入是否在Grails artefacts中起作用?是的,当运行测试(即集成目录中的测试)时,启动应用程序,并创建和注入所有bean,就好像应用程序正在实际运行一样。测试应用程序和运行应用程序之间的唯一区别应该是配置环境 当然,如果您在测试中使用“new”操作符实例化一个需要注入的类,您将无法获得DI的好处。相反,在测试用例中为测试的bean创建一个属性,它将被注入: class

我正在测试我的应用程序的一个服务,它在运行时依赖于另一个服务。测试时,依赖项注入似乎不起作用。在运行集成测试时,依赖项注入是否在Grails artefacts中起作用?

是的,当运行测试(即集成目录中的测试)时,启动应用程序,并创建和注入所有bean,就好像应用程序正在实际运行一样。测试应用程序和运行应用程序之间的唯一区别应该是配置环境

当然,如果您在测试中使用“new”操作符实例化一个需要注入的类,您将无法获得DI的好处。相反,在测试用例中为测试的bean创建一个属性,它将被注入:

class MyServiceTests extends GrailsUnitTestCase {

    MyService service

    void testInjection() {
        assertNotNull service
    }
}

对于那些使用Grails1.3.7的人,我发现不能使用类名来实现依赖注入。而是将服务声明为:

def myService

然后DI魔法发生了。使用1.3.7中的上述代码,NOTNULL断言将失败

谢谢。我正在测试一个依赖于另一个服务的服务,我正在实例化它,正因为如此,我没有得到DI的好处。只是附带说明一下。集成测试不应根据版本扩展GrailsUnitTestCase。这可能会导致ConfigurationHolder.config为null时出现严重问题。是的,grails create integration test在许多版本中确实创建了一个扩展GrailsUnitTestCase的测试,但这是一个最近被修复的错误。为什么答案说“当然,如果实例化了一个需要注入的类”,你就不会得到DI?为什么一般都是这样?这对我来说并不明显——尽管我痛苦地弄明白了。DI是通过框架执行的。框架只知道它实例化的对象。1.3.7及更高版本。这也是2.4.x中的一个问题。此外,对于控制器集成测试,您必须实例化控制器:
def fooController=new fooController()
-然后将正确连接依赖项。