【问题标题】:Grails, Integration Testing, mocking a bean method while testing a service with SpockGrails,集成测试,在使用 Spock 测试服务时模拟 bean 方法
【发布时间】:2023-03-31 18:07:01
【问题描述】:

我在 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() 返回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


【解决方案1】:

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

你可以使用

myBeanMock.beanMethod() >> 'foo'

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

这两种情况的模拟都不应该是集成规范的一部分,因为这是一个集成测试。如您所解释的,可能有需要。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-09
    • 2023-03-23
    • 2016-09-05
    • 1970-01-01
    相关资源
    最近更新 更多