【问题标题】:How to partially mock service in Grails integration test如何在 Grails 集成测试中部分模拟服务
【发布时间】:2015-08-19 19:45:36
【问题描述】:

我正在尝试为调用服务方法的控制器编写测试。我想在该服务中模拟一个依赖方法。

我的规格如下:

MyController myController = new MyController()
def mockMyService

def "My spy should be called"() {
    when:
        mockMyService = Spy(MyService) {
            methodToSpy() >> {
                println "methodToSpy called"
            } // stub out content of this fn
        }
        myController.myService = mockMyService
        myController.callService()

    then:
        1 * mockMyService.methodToSpy()
}

当我尝试运行此测试时,我收到以下错误:

失败:| 我的间谍应该被称为(spybug.MyControllerSpec) | 调用太少: 1 * mockMyService.methodToSpy()(0 次调用) 不匹配的调用(按相似度排序): 1 * mockMyService.serviceMethod() 1 * mockMyService.invokeMethod('methodToSpy', []) 1 * mockMyService.invokeMethod('println', ['in serviceMethod about to call methodToSpy']) 1 * mockMyService.invokeMethod('println', ['Back from methodToSpy'])

如您所见,Spock 正在捕获 Groovy 的 invokeMethod 调用,而不是对实际方法的后续调用。为什么会这样?

完整的项目在here可用。

【问题讨论】:

标签: grails groovy spock


【解决方案1】:

试试这个:

def "My spy should be called"() {
    given:
    mockMyService = Mock(MyService)
    myController.myService = mockMyService

    when:
    myController.callService()

    then:
    1 * mockMyService.methodToSpy(_) >> { println "methodToSpy called" }   
}

根据存根的 spock 文档,如果要使用基数,则必须使用 Mock 而不是存根。

http://spockframework.github.io/spock/docs/1.0/interaction_based_testing.html#_stubbing

【讨论】:

  • 不,我想确保 MyService.callService 调用 methodToSpy。模拟整个服务只允许我确认 callService() 被调用,而不是 callService 调用 methodToSpy()
  • 没问题。 FWIW,我知道 Spock Interactions Documentation 中声明 (Think twice before using this feature. It might be better to change the design of the code under specification.) 的警告,但我认为部分在某些情况下仍然有用,并且希望使其正常工作......
  • 您尝试过使用 GroovySpy 吗?我用 Spock 做了很多测试,根据我使用 Spies 进行部分模拟的经验,只在 20% 的情况下有效,在其他情况下会出现像这样的各种奇怪的失败。最后,我使用 metaClass 更改覆盖被测对象的方法,并在测试后对其进行清理。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多