Groovy 在Spock mock中,无法根据结果验证mock:MissingPropertyException:无此类属性

Groovy 在Spock mock中,无法根据结果验证mock:MissingPropertyException:无此类属性,groovy,mocking,spock,Groovy,Mocking,Spock,我在尝试用测试方法返回的结果检查mock in然后块时出现了一些奇怪的错误,我事先不知道。下面是一个简单的例子: import spock.lang.Specification class MockingTest extends Specification { private MyListener listener = Mock() def 'test listener called'() { when: def service = new

我在尝试用测试方法返回的结果检查mock in然后块时出现了一些奇怪的错误,我事先不知道。下面是一个简单的例子:

import spock.lang.Specification

class MockingTest extends Specification {

    private MyListener listener = Mock()

    def 'test listener called'() {
        when:
        def service = new MyService(listener)
        def message = service.foo()
        then:
        1 * listener.onEvent(message)
    }

    class MyService {
        private MyListener listener;

        MyService(MyListener listener) {
            this.listener = listener
        }

        String foo() {
            String message = "Hello " + new Random().nextInt(10);
            listener.onEvent(message)
            return message;
        }
    }

    class MyListener {
        void onEvent(String message) {
            System.out.println(message);
        }
    }
}
错误是:

No such property: message for class: MockingTest
groovy.lang.MissingPropertyException: No such property: message for class: MockingTest
    at MockingTest.test listener called(MockingTest.groovy:14)
事件

1 * listener.onEvent(message)
被放置在中,那么块似乎是Spock试图提前初始化它,甚至在执行块时之前

有没有办法解决这个问题,并检查mock是用一些局部变量而不是常量调用的?
使用java+mockito非常简单的事情似乎在Spock中非常复杂:(

您可以使用捕获技术实现此目的,在这里您捕获
onEvent
方法调用的第一个参数(
it[0]
),并将其分配到预先声明的变量(
capturedMessage
):

示例中的问题是交互测试(
1*listener.onEvent(message)
)在
foo()
调用完成之前执行,然后还没有声明
message
变量

旁注:
given
是声明和初始化测试数据(如
服务
)的正确部分

def 'test listener called'() {
    given:
    def service = new MyService(listener)
    String capturedMessage = null
    when:
    def message = service.foo()
    then:
    1 * listener.onEvent(_) >> { capturedMessage = it[0] as String }
    message == capturedMessage
}