如何使用 Spock 和 Grails 2 模拟服务方法的接口参数?
How to mock an interface parameter for a service method using Spock and Grails 2?
给出类似的东西:
@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'
}
}
给定 doSomething()
定义如下:
String doSomething(SomeClass thing) {
// ...
return 'nice'
}
应该没有问题。但是如果doSomething
中的参数是一个接口呢? String doSomething(SomeInterface thing)
。我将如何在不直接创建新 SomeClass 的情况下在测试中创建模拟对象(就像我不应该假设它将是哪种对象,但该对象肯定会实现接口)。
您可以使用规范中的 Mock/Stub/Spy 方法(取决于您的需要)
def mokedInterface = Mock(MyInterface)
这是一个模拟 List 接口的例子:
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
}
给出类似的东西:
@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'
}
}
给定 doSomething()
定义如下:
String doSomething(SomeClass thing) {
// ...
return 'nice'
}
应该没有问题。但是如果doSomething
中的参数是一个接口呢? String doSomething(SomeInterface thing)
。我将如何在不直接创建新 SomeClass 的情况下在测试中创建模拟对象(就像我不应该假设它将是哪种对象,但该对象肯定会实现接口)。
您可以使用规范中的 Mock/Stub/Spy 方法(取决于您的需要)
def mokedInterface = Mock(MyInterface)
这是一个模拟 List 接口的例子:
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
}