为什么在spock中调用with-method时得到“groovy.lang.MissingMethodException:没有方法签名”?

时间:2018-02-06 08:31:44

标签: groovy spock

我有一个集成测试。一些代码:

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中得到异常,而不是在闭包调用中。 在我的其他测试形式的测试与闭包(但没有带块)工作正常。这里的闭合类型 - 闭合,在其他测试中 - 闭合,如果它很重要。

我的代码有什么问题?

1 个答案:

答案 0 :(得分:2)

一个问题是withSpecification上的一个方法,但是你在静态上下文中有这个方法,所以此时,没有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
}