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()
}
}
其中 myBean
在 resources.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'
。
任何一种情况模拟都不应该成为集成规范的一部分,因为这是一个集成测试。在您的情况下,如前所述,可能需要。
我在 Grails 2.4.5 中执行集成测试时遇到问题。
我要测试的服务如下所示:
class MyService {
def myBean
def serviceMethod() {
myBean.beanMethod()
}
}
其中 myBean
在 resources.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'
。
任何一种情况模拟都不应该成为集成规范的一部分,因为这是一个集成测试。在您的情况下,如前所述,可能需要。