【发布时间】:2023-03-31 18:07:01
【问题描述】:
我在 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() 返回null。
我已经试过了
ReflectionTestUtils.setField(myService, 'myBean', myBeanMock)
而不是
myService.myBean = myBeanMock
没有运气。
当然,这个简化的示例可以通过单元测试来处理,但我面临的实际情况需要集成测试,因为涉及到数据持久性。
【问题讨论】:
-
myBeanMock.beanMethod(_) >> 'foo'需要一个参数。您可以使用myBeanMock.beanMethod() >> 'foo'或myBeanMock.beanMethod(*_) >> 'foo'。这两种情况的模拟都不应该是集成规范的一部分,因为这是一个集成测试。如您所解释的,可能有需要。 -
哎呀,真丢人,我真的被一个小错误困住了!
myBeanMock.beanMethod(*_) >> 'foo'为我工作,非常感谢。我同意集成测试不应该涉及模拟,但beanMethod()执行对 SOAP 服务的调用,我不希望我的测试依赖于我无法控制的东西。 -
顺便问一下,我怎样才能接受你的评论作为答案?
-
添加评论作为答案。
标签: grails integration-testing spock