我正在尝试测试一项服务。该服务内部是另一个我想要模拟的UserAPIService
。为了模拟它,我正在执行以下操作:
given:
def userAPIServiceMock = mockFor(UserAPIService)
userAPIServiceMock.demand.createUser { def apiToken, firstname, lastname, email -> return true
}
service.userAPIService = userAPIServiceMock.createMock()
在需求闭包中,我并不关心传递给 createUser
方法的参数是什么。有没有一种方法可以让我说“无论传递给 createUser 方法的参数是什么,都返回 true。”
换句话说,我该如何改变
userAPIServiceMock.demand.createUser { def apiToken, firstname, lastname, email -> return true
至
userAPIServiceMock.demand.createUser { [any arguments] -> return true
最佳答案
这对于 Spock 来说是可能的。
语法如下:
mock.method(*_) >> { args -> true }
不确定需要如何模拟您的 Grails 服务,但这里有一个 Spock 中的完整通用示例:
interface Service {
boolean hej( String s, boolean b, char c )
}
class ExampleSpec extends Specification {
def "mock method with any number of args"() {
when:
def mock = Mock( Service )
mock.hej(*_) >> { args -> true }
then:
mock.hej( 'hi', true, 'a' as char ) == true
}
}
args
是一个包含实际参数的 List
,您可以在闭包中检查这些参数并返回适当的值。
关于Grails mock : Supply any argument to demand closure,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48812287/