这个问题是这个Q&A的一个分支:使用System.console()的Test Groovy类
问题:
Spock框架错误地使用varargs检查模拟方法的参数.
重现步骤:
1)创建groovy项目
2)创建一个界面:
interface IConsole { String readLine(String fmt, Object ... args) }
3)创建spock测试:
class TestInputMethods extends Specification { def 'test console input'() { setup: def consoleMock = GroovyMock(IConsole) 1 * consoleMock.readLine(_) >> 'validResponse' when: // here we get exception "wrong number of arguments": def testResult = consoleMock.readLine('testPrompt') then: testResult == 'validResponse' } }
4)尝试运行测试
效果:测试失败,异常"参数数量错误".
解决方法:
对readLine的调用替换为:
def testResult = consoleMock.readLine('testPrompt', [] as Object[])
然后测试成功完成.
题:
有没有更好的方法来"解释"spock,模拟函数的最后一个参数是vararg,因此,它可以省略?
您可以避免使用Mock()而不是GroovyMock()来解释varargs.
一般来说,在编写Spock规范时,除了打算使用GroovyMock的一些独特功能外,你应该更喜欢Spock的Mock对象而不是Groovy的GroovyMock.参考
更换GroovyMock的Mock可以避免冗长的对象参数:
setup: def consoleM = Mock(IConsole) 1 * consoleM.readline(_) >> "hey" when: def result = consoleM.readline("prompt") then: result == "hey"