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

时间:2015-06-09 15:29:42

标签: grails geb

我想在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...
    }
}

据我所知,这应该适用于正常的集成测试。由于它是一个功能测试,事情是完全不同的,它返回null。

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

一些附注......

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

Grails版本:2.4.5

Geb 0.10.0

2 个答案:

答案 0 :(得分:3)

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...
    }
}

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

答案 1 :(得分:2)

有远程控制插件:http://grails.org/plugin/remote-control;说明在https://github.com/alkemist/grails-remote-control/

您将在测试中添加RemoteControl实例并在测试中运行remote.call{ /* server side code */ }(请注意,这必须返回可序列化的内容)。

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