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

如何监视Spock/Groovy中的闭包或代理?

尹雅健
2023-03-14

如何监视Spock/Groovy中的闭包或代理?

Spock有一个限制,您不能使用以下样式的交互测试模式

setup:
subscriber.receive("message1") >> "ok"

when:
publisher.send("message1")

then:
1 * subscriber.receive("message1")
1 * subscriber.receive("message1") >> "ok"
#!groovy
import spock.lang.Specification

class C {
    def c
    C (Closure c) { this.c = c }

    def call (Map args = null) { args? c?.call (args) : c?.call() }
    def call (Map args = null, one) { args? c?.call (args, one) : c?.call (one) }
    def call (Map args = null, one, two) { args? c?.call (args, one, two) : c?.call (one, two) }
    // etc.
}
class spyTest extends Specification {

    void "should accept 0 args" () {
        given:
            def foo = Spy (C, constructorArgs:[{return "foo"}])
        when:
            def result = foo ()
        then:
            1 * foo()
            result == "foo"
    }

    void "should accept 1 positional args, 0 named args" () {
        given:
            def foo = Spy (C, constructorArgs:[{ one -> ["foo", one]}])
        when:
            def result = foo (1)
        then:
            1 * foo(1)
            result == ["foo", 1]
    }

    void "should accept 1 args, + 1 named args" () {
        given:
            def foo = Spy (C , constructorArgs:[{ args, one -> return ["foo", args, one]}])
        when:
            def result = foo (1, a:'a')
        then:
            1 * foo(1, a:'a')
            result == ["foo", [a:'a'], 1]
    }

    void "should accept 2 args, + 0 named args" () {
        given:
            def foo = Spy (C , constructorArgs:[{ one, two -> return ["foo", one, two]}])
        when:
            def result = foo (1,2)
        then:
            1 * foo(1,2)
            result == ["foo", 1, 2]
    }

    void "should accept 2 args, + 2 named args" () {
        given:
            def foo = Spy (C , constructorArgs:[{ args, one, two -> return ["foo", args, one, two]}])
        when:
            def result = foo (1,2, a:'a', b:'b')
        then:
            1 * foo(1,2,a:'a', b:'b')
            result == ["foo", [a:'a', b:'b'], 1, 2]
    }

}

这是可行的,如果有点笨拙,但显然有一个更动态的“闭包”类比一个我必须添加所有潜在数量的参数的类更好。

那么,是否可能有一个更动态的解决方案(如何?),或者使用spygroovyspy这一事实是否禁止了一个更动态的监视类?

共有1个答案

龙俭
2023-03-14

你能再详细说明一下吗?你所展示的一切都可以很容易地用模拟来完成,不需要间谍。


class MockTest extends Specification {

  void "should accept 0 args" () {
    given:
    def foo = Mock (C)
    when:
    def result = foo ()
    then:
    1 * foo() >> 'foo'
    result == "foo"
  }

  void "should accept 1 positional args, 0 named args" () {
    given:
    def foo = Mock (C)
    when:
    def result = foo (1)
    then:
    1 * foo(1) >> { args -> ["foo", args[0]]}
    result == ["foo", 1]
  }

  void "should accept 1 args, + 1 named args" () {
    given:
    def foo = Mock (C)
    when:
    def result = foo (1, a:'a')
    then:
    1 * foo(1, a:'a') >> { args, one -> ["foo", args, one]}
    result == ["foo", [a:'a'], 1]
  }

  void "should accept 2 args, + 0 named args" () {
    given:
    def foo =  Mock (C)
    when:
    def result = foo (1,2)
    then:
    1 * foo(1,2) >> { one, two -> ["foo", one, two]}
    result == ["foo", 1, 2]
  }

  void "should accept 2 args, + 2 named args" () {
    given:
    def foo = Mock (C)
    when:
    def result = foo (1,2, a:'a', b:'b')
    then:
    1 * foo(1,2,a:'a', b:'b') >> { args, one, two -> ["foo", args, one, two]}
    result == ["foo", [a:'a', b:'b'], 1, 2]
  }

}
 类似资料:
  • 我有一个调用管道步骤方法(带有凭据)的共享库。我正在尝试测试withCredentials方法在调用myMethodToTest时是否被sh脚本正确调用,但在withCredentials闭包中迭代时遇到错误: 测试方法 嘲笑 测试用例 错误(it变量在闭包中变为null)

  • 我一直试图在IntelliJ IDEA中创建一个带有Spock测试的Groovy项目。 下面是我遵循的步骤: 创建了Groovy项目并添加了Maven支持。 添加了Spock依赖项和插件。我使用的POM与此非常相似:https://github.com/mariuszs/java-spock-test-sample/blob/master/POM.xml 由于Groovy依赖项冲突,我从模块设置-

  • 我试图测试一个具有注入的RESTClient的Groovy类。 更新:我认为问题的核心是是false。如何断言两个闭包的相等性 我发现我可以在Spock中捕获闭包,从闭包构建XML,并比较XML对象。什么是一个简明和可读的方法来实现这一点?

  • 我试图创建一个JobGenerator类,它将传递一个构建步骤到调用实例。我遇到一个问题,如果我得到这个错误,当我试图运行这个: 哈德逊。远程处理。ProxyException:groovy。lang.MissingMethodException:没有方法org的签名。詹金西。插件。工作流程。cps。2。build()适用于参数类型:(java.util.LinkedHashMap)值:[[job

  • 我在Spring控制器中加载数据库驱动pec.groovymethod.but我不知道如何调用Groovy脚本中的方法。有人能给我建议吗? 带着导游http://docs.groovy-lang.org/latest/html/documentation/guide-integrating.html 我只想访问http://127.0.0.1:8080/spock/test/spock然后运行数据

  • 我使用Spock框架进行测试,直到今天,一切工作都很好;我不知道发生了什么。Intellij说“配置Groovy sdk”,所以我下载了Groovy sdk 2.4.9并对其进行了配置,但在导入行的测试类中: 导入spock.lang.specification intellij说“无法解析符号Spock”。有什么建议吗?