【问题标题】:Spock: mock a method with varargsSpock:使用可变参数模拟方法
【发布时间】:2013-12-27 21:39:37
【问题描述】:

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

问题:

Spock 框架错误地使用可变参数检查模拟方法的参数。

重现步骤:

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 模拟函数的最后一个参数是可变参数,因此可以省略?

【问题讨论】:

    标签: unit-testing groovy mocking spock


    【解决方案1】:

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

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

    将 Mock 换成 GroovyMock 可以避免冗长的 Object 参数:

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

    【讨论】:

    • GroovyMock 也来自 Spock,但你是对的,它只应在真正需要时使用,因为它更复杂且有一些限制。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-22
    • 1970-01-01
    • 1970-01-01
    • 2013-04-26
    • 2018-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多