如何使用Spock和Grails2模拟服务方法的接口参数?

如何使用Spock和Grails2模拟服务方法的接口参数?,grails,spock,Grails,Spock,假设: @TestFor(MyService) @Mock(SomeClass) class WhateverSpec extends Specification { def 'Test a mock'() { given: def someObject = new SomeClass(name: 'hello') assert someObject.name == 'hello' when: def result = service.doSomet

假设:

@TestFor(MyService)
@Mock(SomeClass)
class WhateverSpec extends Specification {
  def 'Test a mock'() {
    given:
    def someObject = new SomeClass(name: 'hello')
    assert someObject.name == 'hello'

    when:
    def result = service.doSomething(someObject)

    then:
    result == 'nice'
  }
}
String doSomething(SomeClass thing) {
  // ...
  return 'nice'
}
给定的
doSomething()
定义如下:

@TestFor(MyService)
@Mock(SomeClass)
class WhateverSpec extends Specification {
  def 'Test a mock'() {
    given:
    def someObject = new SomeClass(name: 'hello')
    assert someObject.name == 'hello'

    when:
    def result = service.doSomething(someObject)

    then:
    result == 'nice'
  }
}
String doSomething(SomeClass thing) {
  // ...
  return 'nice'
}

应该没有问题。但是如果
doSomething
中的参数是一个接口怎么办<代码>字符串doSomething(SomeInterface thing)。我如何在测试中创建一个模拟对象而不直接创建一个新的SomeClass(比如我不应该假设它是什么类型的对象,但该对象肯定会实现接口)。

您可以使用规范中的mock/Stub/Spy方法(取决于您的需要)

下面是一个模拟列表界面的示例:

def 'should mock List interface size method'() {
    given:
        def mockedList = Mock(List)
        def expectedListSize = 2
        mockedList.size() >> expectedListSize
    when:
        def currentSize = mockedList.size()
    then:
        currentSize == expectedListSize
}

def interfaceMock=Mock(SomeInterface)参见@rgrebski为什么不回答这个问题?;)