简体   繁体   English

控制器测试中的 Grails 4.0 Mock 服务方法

[英]Grails 4.0 Mock service method in controller test

I have a controller like this:我有一个这样的控制器:

class NotificationApiController {

    def countService

    def getCount() {
        def results = countService.getCount()

        render results as JSON
    }
}

And the controller test like this:控制器测试如下:

Closure doWithSpring() {{ ->
        countService(CountService)
    }}

CountService countService

def setup() {
}

def cleanup() {
}

void "test getCount method"() {
        given:
        def countService = Mock(CountService) {
            1 * getCount(_) >> [count: 2]
        }
        when:
        def y = controller.getCount()

        then:
        y == [count: 2]
    }

It appears it always calls into the actual CountService injected in Closure doWithSpring(), not my mock countService, but without the definition of Closure doWithSpring()..., I will get this error看起来它总是调用在 Closure doWithSpring() 中注入的实际 CountService,而不是我的模拟 countService,但没有 Closure doWithSpring() 的定义...,我会得到这个错误

Cannot invoke method getCount() on null object
java.lang.NullPointerException: Cannot invoke method getCount() on null object

The documentation on unit testing in 4.0 is really limited and I am not exactly sure how should I do this. 4.0 中单元测试的文档非常有限,我不确定我应该如何做。 I see some samples in Grails 2.3 or 3.3.我在 Grails 2.3 或 3.3 中看到了一些示例。 version, but they all seems not working for me, mostly due to the difference of Spock and Mixin framework I guess.版本,但它们似乎都不适合我,主要是由于我猜是 Spock 和 Mixin 框架的差异。 Any suggestions on how to do this?关于如何做到这一点的任何建议?

You have omitted some details that might affect the recommendation but the project at https://github.com/jeffbrown/chrisjiunittest shows 1 way to go about this.您省略了一些可能会影响建议的细节,但https://github.com/jeffbrown/chrisjiunittest 上的项目显示了 1 种方法。

https://github.com/jeffbrown/chrisjiunittest/blob/a59a58e3b6ed6b47e1a8104f3e4d3bdb138abacc/src/test/groovy/chrisjiunittest/NotificationApiControllerSpec.groovy https://github.com/jeffbrown/chrisjiunittest/blob/a59a58e3b6ed6b47e1a8104f3e4d3bdb138abacc/src/test/groovy/chrisjiunittest/NotificationApiControllerSpec.groovy

package chrisjiunittest

import grails.testing.web.controllers.ControllerUnitTest
import spock.lang.Specification

class NotificationApiControllerSpec extends Specification implements ControllerUnitTest<NotificationApiController> {

    void "test something"() {
        setup:
        // whether or not this is the right thing to do
        // depends on some other factors, but this is
        // an example of one approach...
        controller.countService = Mock(CountService) {
            getCount() >> [count: 2]
        }

        when:
        controller.getCount()

        then:
        response.json == [count: 2]
    }
}

Another option:另外一个选项:

package chrisjiunittest

import grails.testing.web.controllers.ControllerUnitTest
import spock.lang.Specification

class NotificationApiControllerSpec extends Specification implements ControllerUnitTest<NotificationApiController> {

    Closure doWithSpring() {
        // whether or not this is the right thing to do
        // depends on some other factors, but this is
        // an example of one approach...
        { ->
            countService MockCountService
        }
    }

    void "test something"() {
        when:
        controller.getCount()

        then:
        response.json == [count: 2]
    }
}

class MockCountService {
    Map getCount() {
        [count: 2]
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM