Spock:用varargs模拟一个方法

时间:2013-12-27 21:39:38

标签: unit-testing groovy mocking spock

此问题是此问答的分支:Test Groovy class that uses System.console()

问题:

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,因此可以省略它?

1 个答案:

答案 0 :(得分:6)

您可以避免使用Mock()而不是GroovyMock()来解释varargs。

一般来说,在编写Spock规范时,除了打算使用GroovyMock的一些独特功能外,你应该更喜欢Spock的Mock对象而不是Groovy的GroovyMock。 Reference

交换模拟GroovyMock允许你避免冗长的对象参数:

        setup:
            def consoleM = Mock(IConsole)
            1 * consoleM.readline(_) >> "hey"

        when:
            def result = consoleM.readline("prompt")

        then:
            result == "hey"