在 Geb 功能测试中使用服务 bean 和依赖注入

Using service beans and dependency Injection in Geb Functional Tests

我想在我的 Geb 测试中使用一个服务来填充一些示例数据。示例数据庞大且复杂,我们已经编写了代码来为其他控制器和服务创建它。因此,一个简单的模拟是不可能的。如何在我的 Geb 测试中访问此服务?

假设我的服务名称是 testDataService,看起来像这样...

class TestDataService {

    def otherService

    void importData() {
        otherService.getData()
    }
}

像 Geb 中的以下内容是理想的...

class testSpec extends GebReportingSpec {

    @Shared def testDataService

    def setupSpec() {
        testDataService.importData()
    }

    def test1() {
        ...some test...
    }
}

据我了解,这应该适用于正常的集成测试。由于它是功能测试,因此情况大不相同,它 returns 为空。

我发现了很多关于 Grails Remote Control 插件的建议,但我想知道没有它如何做到这一点。

一些旁注...

服务 class 位于 src/groovy 内。虽然我确信我正确地连接了它,因为它在被其他服务调用时按预期工作。仅在功能测试中不起作用。

Grails 版本:2.4.5

Geb 0.10.0

有远程控制插件:http://grails.org/plugin/remote-control; instructions are on https://github.com/alkemist/grails-remote-control/

您将在您的测试中添加一个 RemoteControl 实例并在您的测试中添加 运行 remote.call{ /* server side code */ }(注意这必须 return 可序列化的东西)。

在 grails 的功能测试中,您基本上不再参与所有 IoC 和 grails 魔法;您将被视为与服务器交互的普通客户端。

对于 Grails 2.4.5

def testDataService = Holders.applicationContext.getBean("testDataService")

因此我们的测试规范可能如下所示...

class testSpec extends GebReportingSpec {

    @Shared def testDataService = Holders.applicationContext.getBean("testDataService")

    def setupSpec() {
        testDataService.importData()
    }

    def test1() {
        ...some test...
    }
}

请注意,所有来自其他服务的注入依赖项都应该存在。