Spock:用varargs模拟一个方法

 Aaron阿龙_1947_446 发布于 2023-02-07 19:04

这个问题是这个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,因此,它可以省略?

1 个回答
  • 您可以避免使用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"
    

    2023-02-07 19:07 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有