Grails - 如何在进行控制器测试时在Controller中实例化服务

时间:2016-03-23 21:56:47

标签: grails grails-controller

我在控制器中使用服务。我正在为控制器编写单元测试,但我无法在控制器中实例化服务。它总是null

如果我在Controller测试类中使用new运算符实例化服务。服务类中的服务未实例化。

如何在测试类中实例化服务?

1 个答案:

答案 0 :(得分:7)

你可以让Spring为你做。

依赖于服务的控制器:

// grails-app/controllers/demo/DemoController.groovy
package demo

class DemoController {
    def helperService

    def index() {
        def answer = helperService.theAnswer
        render "The answer is ${answer}"
    }
}

服务:

// grails-app/services/demo/HelperService.groovy
package demo

class HelperService {

    def getTheAnswer() {
        42
    }
}

注入服务的单元测试:

// src/test/groovy/demo/DemoControllerSpec.groovy
package demo

import grails.test.mixin.TestFor
import spock.lang.Specification

@TestFor(DemoController)
class DemoControllerSpec extends Specification {

    static doWithSpring = {
        helperService HelperService
    }

    void "test service injection"() {
        when:
        controller.index()

        then:
        response.text == 'The answer is 42'
    }
}

单元测试,注入虚假版本的服务:

// src/test/groovy/demo/AnotherDemoControllerSpec.groovy
package demo

import grails.test.mixin.TestFor
import spock.lang.Specification

@TestFor(DemoController)
class AnotherDemoControllerSpec extends Specification {

    static doWithSpring = {
        helperService DummyHelper
    }

    void "test service injection"() {
        when:
        controller.index()

        then:
        response.text == 'The answer is 2112'
    }
}

class DummyHelper {

    def getTheAnswer() {
        2112
    }
}