unit-testing - Spock:使用可变参数模拟方法

标签 unit-testing groovy mocking spock

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

问题:

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

重现步骤:

1)创建groovy项目

2)创建接口(interface):

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

最佳答案

您可以避免使用 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"

关于unit-testing - Spock:使用可变参数模拟方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20808189/

相关文章:

unit-testing - 为什么 `go test -run NotExist` 通过?

ruby-on-rails - 更新、显示和销毁的 Controller 测试不适用于引用的类

grails - 在 Groovy/Grails 中设置 new URL(...).text 的超时

java - 如何使用 jmockit 模拟 RestTemplate getForObject 方法?

python 测试。原始输入测试

c - 单元测试实际过程

unit-testing - 使用链接 : '<Link>s rendered outside of a router context cannot navigate.' 测试子组件

grails - 编写必须对命令对象和域对象起作用的自定义 grails 唯一约束

java - 将 groovy 的 RestClient 与 ignoreSSLIssues() 一起使用时出现 SSLPeerUnverifiedException :"peer not authenticated"

c# - 不确定如何模拟 INancyModule.View 方法?