如何使用spock框架捕获参数?

如何使用spock框架捕获参数?,spock,Spock,我有一些类似Java的东西: 公共接口事件总线{ 无效火灾事件(GwtEvent事件); } 公共类SaveCommentEvent扩展了GwtEvent{ 私人财务意见; 私人最终评论新出现; public SaveCommentEvent(注释旧注释、注释新注释){ this.oldcoment=oldcoment; 这个。新来者=新来者; } 公共评论getOldComment(){…} 公共评论getNewComment(){…} } 测试代码如下: def“…”(){ EventBu

我有一些类似Java的东西:

公共接口事件总线{
无效火灾事件(GwtEvent事件);
}
公共类SaveCommentEvent扩展了GwtEvent{
私人财务意见;
私人最终评论新出现;
public SaveCommentEvent(注释旧注释、注释新注释){
this.oldcoment=oldcoment;
这个。新来者=新来者;
}
公共评论getOldComment(){…}
公共评论getNewComment(){…}
}
测试代码如下:

def“…”(){
EventBus EventBus=Mock()
Comment oldcoment=Mock()
注释mnet=Mock()
什么时候:
fireEvent(新的SaveCommentEvent(旧的Comment,新的Comment))
然后:
1*eventBus.fireEvent(
{
it.source.getClass()==SaveCommentEvent;
it.oldcoment==oldcoment;
it.newComment==新来者
}
)            
}
我想验证是否使用类型为
SaveCommentEvent
且结构参数为
oldcoment
newComment
的事件调用一次
eventBus.firevent(..)

代码运行时没有错误,但问题是:

在从

{
it.source.getClass()==SaveCommentEvent;
it.oldcoment==oldcoment;//old==old
it.newComment==newComment//new==new
}

{
it.source.getClass()=其他类文字;
it.oldcoment==newComment;//old==new
it.newComment==oldcoment//new==old
}
不过,代码运行时不会出错吗?显然,闭包并没有达到我想要的效果,所以问题是:如何进行参数捕获

then:
     1*eventBus.fireEvent(
                            {
                               it.source.getClass()==SaveCommentEvent;
                               it.oldComment==oldComment;
                               it.newComment==newComment
                             }
                          )            
在您的代码中,它是对没有字段的模拟事件总线接口的引用。你怎么能证实他们

此外,我认为使用Spock Mocks必须发生的事件顺序不一定是直观的。我会把它写在这里,除非它不如。

我明白了:

SaveCommentEvent firedEvent
鉴于:
...
什么时候:
....
然后:
1*eventBus.fireEvent()>{arguments->firedEvent=arguments[0]}
SaveModelEvent的firedEvent实例
firedEvent.newModel==newModel
firedEvent.oldModel==oldModel

在上面@alex luya的回答中,我发现变量
firedEvent
需要
@Shared
注释

然后,我可以捕获该值并对闭包外的值运行检查。

与相同的想法,但将断言放在闭包中,并对每个断言使用
assert
。比照

在2021年(7年后),可以使用groovy(2.5)执行以下操作:


。。哪个对我来说更方便,并且节省了一两行。:)

谢谢,不过我还是不知道怎么做。你想做的是高级的。哪一部分最令人困惑?@jeremyjjbrown如果我没有弄错的话,您提供的代码不是100%正确的。具体来说,只有当
it.newComment==newComment
检查未通过时,测试才会失败。前两次检查不会对测试的通过或失败产生任何影响。这就是@PeterNiederwieser在其注释replace
中所暗示的与原始代码中的
&&
。(代码参数约束需要返回truefalse,具体取决于它们是否匹配。)我发现,无论变量定义在何处,都无法在闭包之外访问捕获的参数。使用此方法而不仅仅是替换的主要好处是:;在最初的代码中,使用&&可以获得更精细的错误消息—您确切地知道什么条件failedSpock似乎混淆了捕获为模拟返回值的参数。它对其他人有什么作用@AlexLuya@Vishal闭包将返回最后一行作为mock的返回值,因此如果返回类型与参数类型不同,那么您应该从closureThank@MikCorevent显式返回正确类型的对象,我的意图是链接到multiple
assert
示例;因此,这一联系在这方面看起来是正确的。至于jeremyjjbrown的回答,我不确定@geoand指出,并不是所有的断言都有效。我再也没有一个片段可以做实验了:pAh,在“不是很有帮助。幸运的是,我们可以做得更好”下面的东西:。。。我没发现。同样是的,@geoand的观点是正确的。我错了,太好了。谢谢@ryu1kn!这是最简单也是最好的语法。
    then:
    1 * eventBus.fireEvent(_) >> {
        def firedEvent = it[0]
        assert firedEvent instanceof SaveModelEvent
        assert firedEvent.newModel == newModel
        assert firedEvent.oldModel == oldModel
    }
    ...

    then:
    1 * eventBus.fireEvent(_) >> { SaveModelEvent event ->
        event.newModel == newModel
        event.oldModel == oldModel
    }
    0 * _