Grails,集成测试,在使用 Spock 测试服务时模拟 bean 方法

Grails, Integration Testing, mocking a bean method while testing a service with Spock

我在 Grails 2.4.5 中执行集成测试时遇到问题。

我要测试的服务如下所示:

class MyService {

    def myBean

    def serviceMethod() {
        myBean.beanMethod()
    }
}

其中 myBeanresources.groovy 中定义:

beans = {
    myBean(MyBeanImpl)
}

集成测试来了:

MyServiceIntegrationSpec extends IntegrationSpec {

    def myService

    def setup() {
        def myBeanMock = Mock(MyBeanImpl)
        myBeanMock.beanMethod(_) >> 'foo'
        myService.myBean = myBeanMock
    }

    void "silly test"() {
        expect: 
        myService.serviceMethod() == 'foo'
    }
}

好吧,这很失败,因为 myService.serviceMethod() returns null.

我已经试过了

ReflectionTestUtils.setField(myService, 'myBean', myBeanMock)

而不是

myService.myBean = myBeanMock

运气不好。

当然这个简化的例子可以用单元测试来处理,但我面临的真实案例需要集成测试,因为涉及到数据持久性。

myBeanMock.beanMethod(_) >> 'foo' 需要一个参数。

您可以使用

myBeanMock.beanMethod() >> 'foo'

myBeanMock.beanMethod(*_) >> 'foo'

任何一种情况模拟都不应该成为集成规范的一部分,因为这是一个集成测试。在您的情况下,如前所述,可能需要。