Spock:在桩(Stubs)中返回输入参数

9

给定一个带有参数的方法 在Java中,例如:

public class Foo {
   public Bar theBar(Bar bar) { /*... */ }   
}

当对foo进行桩造/模拟时,我该如何告诉它接受任何参数并返回它?(Groovy
def fooStub = Stub(Foo) {
  theBar(/*what to pass here*/) >> { x -> x }
}

正如你所看到的,我通过了身份函数。然而,我不知道应该传递什么参数。_ 不起作用,因为它是一个 ArrayList,因此不是 Bar 类型。


你的规格上有@CompileStatic@TypeChecked吗?可以贴出你的整段代码吗,没有理由为什么_不会起作用。 - Leonard Brünings
刚遇到了同样的设置和情况。我正在尝试从Spock + Groovy存根Java类,并且我只想返回该方法的输入,没有更多,也没有更少。由于我不知道发生了什么,我只能将我的解决方案留作评论,并且如果有人能启发我,我会非常感激。似乎箭头前面的 x 输入实际上是方法调用的整个参数列表? 执行以下操作可解决问题:theBar(_)>> {args - > args.get(0)}。但是为什么需要这样做呢?如何正确地表达这一点而无需任何技巧? - tiguchi
2个回答

10
你可以用以下方式来存根Foo类:
Foo foo = Stub(Foo)
foo.theBar(_ as Bar) >> { Bar bar -> bar }

这里是完整的例子:

import groovy.transform.Immutable
import spock.lang.Specification

class StubbingSpec extends Specification {

    def "stub that returns passed parameter"() {
        given:
        Foo foo = Stub(Foo)
        foo.theBar(_ as Bar) >> { Bar bar -> bar }

        when:
        def result = foo.theBar(new Bar(10))

        then:
        result.id == 10
    }

    static class Foo {
        Bar theBar(Bar bar) {
            return null
        }
    }

    @Immutable
    static class Bar {
        Integer id
    }
}

你尝试过使用Java类FooBar进行相同的操作吗? - user3001
@user3001 是的,当 FooBar 是 Java 类时,它的工作方式完全相同。我刚测试了这个例子,并得到了相同的结果。 - Szymon Stepniak

0

我不确定你的意思。_是正确的传递对象。为什么你认为它是ArrayList?它是Object类型,可以用于任何东西。


这意味着在Java中,它的类型错误(不是“Bar”),对吗? - user3001
那么?Spock是基于Groovy的,你不能在Java中使用Spock。 - Vampire

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