一个简单的答案是不要对模拟/存根/间谍使用@Shared。
@Shared def proc = new MyProcessor()def test() { given: def log = Mock(LogService) proc.logService = log when: proc.process(new Object()) then: 1 * log.update(_)}现在说明:运行规范时,Spock会为每个测试创建一个Specification实例,此外,它还会创建一个共享的Specification实例来跟踪共享字段。
查看org.spockframework.runtime.baseSpecRunner,您将看到两个字段:
protected Specification sharedInstance;protected Specification currentInstance;
此外,有两个规范上下文:共享和当前。上下文保留实例,模拟上下文和模拟控制器。问题来了。当您宣布模拟共享时,它绑定到共享模拟控制器,但是当您拒绝交互(“
then:”块)时,Spock会将这些交互添加到当前的模拟控制器中。因此,当调用模拟方法(例如logService.update(e))时,Spock会检查是否允许与共享模拟控制器进行此交互,因为您将模拟声明为共享但未在其中找到任何东西,因为您已将交互置于当前控制器中。
不要将模拟/存根/间谍用作@Shared字段。



