我有一个集成测试。一些代码:
Test1 {
static closure1 = { Class1 resultState, Class1 originState ->
with(resultState) {
name == originState.name
breed == originState.breed
bornDate == originState.bornDate
}
}
@Unroll
def 'exercise #methodName'() {
...
expected(resultState, originState)
...
methodName || expected
'name1' || closure1
}
}
我得到一个groovy.lang.MissingMethodException:没有方法签名:Test1 $ __ clinit__closure10.with()适用于参数类型:(Class1,Test1 $ __ clinit__closure10 $ _closure12)值:[// values].
但是当我使用方法而不是闭包重构我的代码时,一切都很好。
Test1 {
void method1(Class1 resultState, Class1 originState) {
with(resultState) {
name == originState.name
breed == originState.breed
bornDate == originState.bornDate
}
}
@Unroll
def 'exercise #methodName'() {
...
expected(resultState, originState)
...
methodName || expected
'name1' || closure1
}
}
但为什么?在闭包中 - 我在with-block中得到异常,而不是在闭包调用中。 在我的其他测试形式的测试与闭包(但没有带块)工作正常。这里的闭合类型 - 闭合,在其他测试中 - 闭合,如果它很重要。
我的代码有什么问题?
答案 0 :(得分:2)
一个问题是with
是Specification
上的一个方法,但是你在静态上下文中有这个方法,所以此时,没有with
方法可以调用...
另一个是这不在spec方法之外,所以a == b
行不会被断言,因为spock dsl不会接收它们......
一个解决方案是使它成为一个方法,并传入一个方法句柄,并断言你的值,如果它们全部通过则返回true:
private test1(resultState, originState) {
with(resultState) {
assert name == originState.name
assert breed == originState.breed
assert bornDate == originState.bornDate
}
true
}
@Unroll
def 'exercise #methodName'() {
...
then:
expected(resultState, originState)
where:
methodName || expected
'name1' || this.&test1
}