【问题标题】:Dependency injection in Grails integration testsGrails 集成测试中的依赖注入
【发布时间】:2010-02-16 12:00:48
【问题描述】:

我正在测试我的应用程序的一项服务,该服务依赖于运行时的其他服务。测试时,依赖注入似乎不起作用。运行集成测试时,依赖注入是否适用于 Grails 工件?

【问题讨论】:

    标签: grails integration-testing


    【解决方案1】:

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

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

    class MyServiceTests extends GrailsUnitTestCase {
    
        MyService service
    
        void testInjection() {
            assertNotNull service
        }
    }
    

    【讨论】:

    • 谢谢。我正在测试一个依赖于其他服务的服务,并且我正在实例化它,因此,我没有得到 DI 的好处。
    • 只是一个旁注。集成测试不应根据版本扩展 GrailsUnitTestCase,这可能会导致 ConfigurationHolder.config 为空的严重问题。是的,许多版本中的 grails create-integration-test 确实创建了一个扩展 GrailsUnitTestCase 的测试,但这是最近修复的一个错误。
    • 为什么答案是“当然,如果你实例化一个需要注入的类”你不会得到 DI?为什么一般会这样?这对我来说并不明显——尽管我很痛苦地想通了。
    • DI 是通过框架执行的。框架只知道它实例化的对象。
    【解决方案2】:

    对于那些使用 Grails 1.3.7 的人,我发现不能使用类名来使依赖注入起作用。相反,将服务声明为:

    def myService
    

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

    【讨论】:

    • 1.3.7 及更高版本。这也是 2.4.x 中的一个问题。此外,对于控制器集成测试,您必须实例化控制器:def fooController = new FooController() - 然后依赖项将正确连接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-22
    • 1970-01-01
    • 1970-01-01
    • 2013-01-03
    • 1970-01-01
    • 2017-06-05
    • 1970-01-01
    相关资源
    最近更新 更多