如何监视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]
}
}
这是可行的,如果有点笨拙,但显然有一个更动态的“闭包”类比一个我必须添加所有潜在数量的参数的类更好。
那么,是否可能有一个更动态的解决方案(如何?),或者使用spy
或groovyspy
这一事实是否禁止了一个更动态的监视类?
你能再详细说明一下吗?你所展示的一切都可以很容易地用模拟来完成,不需要间谍。
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”。有什么建议吗?