2010-02-16 130 views
6

我在测试运行时依赖于其他服务的应用程序的服务。测试时,依赖注入似乎不起作用。运行集成测试时,依赖注入在Grails artefact中起作用吗?Grails集成测试中的依赖注入

回答

8

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

当然,如果你在你的测试中实例化一个需要使用'new'操作符注入的类,你将不会得到DI的好处。相反,为bean创建测试用例属性的测试,其结果将被注入:

class MyServiceTests extends GrailsUnitTestCase { 

    MyService service 

    void testInjection() { 
     assertNotNull service 
    } 
} 
+0

谢谢。我正在测试一项依赖于其他服务的服务,并且我正在对它进行实例化,正因为如此,我没有得到DI的好处。 – Lucas 2010-02-16 15:37:27

+2

只是一个侧面说明。集成测试不应该根据版本扩展GrailsUnitTestCase,这可能会导致您的ConfigurationHolder.config为空的严重问题。是的,许多版本的grails create-integration-test确实会创建一个扩展GrailsUnitTestCase的测试,但这是一个最近已经修复的bug。 – 2011-01-31 20:30:56

+0

为什么答案会说“当然,如果你实例化一个需要注射的类”你不会得到DI?为什么通常是这种情况?这对我来说并不明显 - 尽管我痛苦地想出了它。 – 2012-11-25 01:09:16

4

对于那些使用Grails 1.3.7你,我发现,你不能用类名为了让依赖注入工作。相反,宣布服务为:

def myService 

然后发生DI魔术。通过1.3.7中的上述代码,not null断言将失败。

+0

1.3.7以上。这在2.4.x中也是一个问题。另外,对于控制器集成测试,您必须实例化控制器:'def fooController = new FooController()' - 则依赖关系将被正确连接。 – 2015-09-25 18:09:20