当前位置: 首页 > 知识库问答 >
问题:

Spock:用varargs模拟一个方法

汪庆
2023-03-14

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'
  }
}
def testResult = consoleMock.readLine('testPrompt', [] as Object[])

有没有更好的方法来“解释”spock被模仿函数的最后一个参数是vararg,因此可以省略它?

共有1个答案

杜思远
2023-03-14

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

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

将Mock替换为GroovyMock可以避免冗长的对象参数

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

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

        then:
            result == "hey"
 类似资料:
  • 我试图在Spock中模拟。斯波克失败了 MyTest.groovy:

  • 我正在学习使用Spock进行单元测试,遇到了一个我似乎无法理解的问题: 注意:这个例子非常简化,但它得到了我想要实现的概念。 在正常操作中,调用会阻塞,直到建立到的连接。 我希望能够测试返回的上的交互。我可以通过以下方式与Spock一起做到这一点: 乍一看,这工作得很好,只是对的每次调用都将返回经过嘲弄的。由于此调用(有意地)被调用的次数不确定(因为我想接受不确定数量的入站连接),所以mock上的

  • 我目前正在为一个groovy应用程序编写单元testcase 有人能告诉我这是不是嘲弄斯波克的两个电话的正确方法?如果没有,那么请引导我走向正确的解决方案。

  • 注意:这个示例非常简单,但它得到了我想要实现的跨越的想法。 我有一个类(称为),它接受作为构造函数参数;它有一个方法,该方法生成一个执行以下操作的新线程(为简洁起见,大大减少了): 在正常操作中,调用会阻塞,直到与建立连接为止。 但这让我产生了错误的感觉;我不是真的在寻找至少一个互动,我真的在寻找一个互动。 我可以这样做(返回一次模拟的套接字,然后返回null): 但是,我仍然有大量对的调用,这些

  • 我有一个用注释的Groovy类,因此它得到一个私有的最终字段,我想测试它的用法。我想继续使用,而不是为了启用测试而进一步公开字段。 我正在使用Spock1.0编写测试,并尝试使用Spock的集成、模拟和截尾功能来完成测试。全局截尾可以帮助我截取调用以获得实际的实例,因此我目前的猜测是: 有趣的是,拦截实际上起作用了,确认类实际上获得了名为“dummy”的类型“logger”的对象

  • 我试图为一个类编写一个单元测试,这个类使用带有库中的的Google vision API。问题是,由于某种原因,我的模拟仍然调用真正的方法,然后抛出一个NPE,这破坏了我的测试。我以前从未在模拟上见过这种行为,我想知道我是不是做错了什么,是不是Spock/Groovy中有bug,还是与Google lib有关?