Spock框架:匹配通配符参数

6

我正在尝试编写一个Spock规范,其中我想验证使用三个参数调用的方法。我完全不关心前两个参数,任何参数类型的实例都可以。

我尝试使用Spock通配符参数匹配,但一直遇到问题。我的验证代码如下:

    when:
    packageUploadController.handleUpload(httpRequest)

    then: "the value of the 'dest' parameter is passed on to saveservice"
    saveService.saveImportPackage(_ as UploadedPackage, _ as PackageImportResponse.Builder)

在这里,saveService是一个模拟对象,而UploadedPackage和 PackageImportResponse.Builder则是期望的参数。在更改调用saveService的代码之前,我先试图得到一个可运行的测试。
就我所见,我正在按照文档进行操作,但是测试失败并显示以下消息:
org.codehaus.groovy.runtime.typehandling.GroovyCastException: 
Cannot cast object '_' with class 'org.spockframework.lang.Wildcard' to 
class 'UploadedPackage' due to:
groovy.lang.GroovyRuntimeException: Could not find matching constructor for: 
UploadedPackage(org.spockframework.lang.SpreadWildcard)

我不理解这个消息,因为它似乎表明我的生产代码需要提供一个以 SpreadWildCard 为参数的构造函数。我在这里做错了什么?

我还尝试过省略类型,只匹配 (_, _),但这也失败了:

org.codehaus.groovy.runtime.metaclass.MissingMethodExceptionNoStack: No signature of method: 
SaveService$$EnhancerByCGLIB$$67b7324.saveImportPackage() is applicable for argument types: (org.spockframework.lang.Wildcard, org.spockframework.lang.Wildcard) values: [[*_], [*_]]

我认为我按照文档的要求操作,但不明白为什么会失败(后来我添加了类型以尝试消除此错误)。


我想我有一个解决方案,但是有人能解释一下为什么这样会起作用吗??saveImportPackage(_, _) 方法的返回类型是 void;当我将验证更改为:saveService.saveImportPackage(_ as UploadedPackage, _ as PackageImportResponse.Builder) >> void测试变成绿色了 - 为什么添加返回类型会使关于参数类型的警告消失?? - Ton van Bart
只是为了验证一下,看起来你传递了两个参数,但你想要传递3个,这可能是问题所在吗? - devnoo
很好的发现,但我首先要为两个参数的情况编写一个可工作的测试,然后验证第三个参数应该会使测试失败,迫使我将其添加到受测代码中(我正在使用TDD)。 - Ton van Bart
如果你的方法签名有三个参数,那么你必须传递三个参数。 - Jon Peterson
我理解,但我是反其道而行之:当我添加第三个参数时,我希望测试失败,从而强制我将该参数添加到方法中。但为了实现这一点,我首先想看到它使用两个参数的情况下能否正常工作。 - Ton van Bart
1个回答

9

输入1*,然后保存saveService.saveImportPackage(_ as UploadedPackage, _ as PackageImportResponse.Builder),在类似的情况下似乎可以起作用。并不完全清楚为什么。

 then: "the value of the 'dest' parameter is passed on to saveservice"
 1 * saveService.saveImportPackage(_ as UploadedPackage, _ as PackageImportResponse.Builder)

1 * 表示他的模拟方法将根据“when”条件调用一次。 - Jason Slobotski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接