Groovy 在Spock mock中,无法根据结果验证mock:MissingPropertyException:无此类属性
我在尝试用测试方法返回的结果检查mock in然后块时出现了一些奇怪的错误,我事先不知道。下面是一个简单的例子: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
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
}