【问题标题】:Spock: Return input parameter in StubsSpock:在存根中返回输入参数
【发布时间】:2018-03-18 09:13:53
【问题描述】:

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

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

当存根/模拟 foo 时,我如何告诉它接受任何参数并返回它? (时髦

def fooStub = Stub(Foo) {
  theBar(/*what to pass here*/) >> { x -> x }
}

如您所见,我通过了身份函数。但是我不知道该传递什么作为论点。 _ 不起作用,因为它是 ArrayList,因此不是 Bar 类型

【问题讨论】:

  • 您的规格中有@CompileStatic@TypeChecked 吗?你能发布你的整个代码吗,_ 没有理由不工作。
  • 刚刚遇到相同的设置和情况。尝试从 Spock + Groovy 存根 Java 类,我只想返回方法的输入,不多不少。由于我不知道发生了什么,我只是将我的解决方案作为评论留下,如果有人能启发我,我将不胜感激。似乎箭头之前的x 输入实际上是方法调用的整个参数列表?执行以下操作可以解决问题:theBar(_) >> { args -> args.get(0) }。但为什么这是必要的?如何在没有任何技巧的情况下正确表达这一点?

标签: java groovy mocking spock


【解决方案1】:

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

【讨论】:

  • 这意味着在Java中,它的类型错误(不是Bar),对吧?
  • 所以? Spock 是基于 Groovy 的,您不能将 Spock 与 Java 一起使用。
【解决方案2】:

您可以通过以下方式存根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
    }
}

【讨论】:

  • 您是否尝试过将FooBar 作为Java 类?
  • @user3001 是的,当FooBar 是Java 类时,它的工作原理完全相同,只是测试了这个例子,得到了相同的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多