【问题标题】:Spock invocation for Groovy's generated getters using a final field使用 final 字段对 Groovy 生成的 getter 进行 Spock 调用
【发布时间】:2013-12-20 10:55:32
【问题描述】:

Groovy generates getters and setters 用于所有班级的字段。所以当你这样做时:

class Foo {
    final bar
}
new Foo().bar

你实际上是在调用生成的方法Foo.getBar()

我有一个 Spock 规范,它喜欢检查这样一个生成的 getter 的调用:

def "some spock test"() {
    given: def fooMock = Mock(Foo)
    when:  someFunction(fooMock)
    then:  1 * fooMock.getBar()
}

someFunction() fooMock.bar 但我总是得到 ​​p>

Too few invocations for:
1 * fooMock.getBar()   (0 invocations)

1 * fooMock.bar 也不起作用。在测试中如何检查bar 是从Foo 读取的?如果我省略final,它会起作用,但这是一个糟糕的解决方案......

【问题讨论】:

    标签: groovy getter-setter spock


    【解决方案1】:

    对于final 属性,Groovy 生成一个final getter 方法。但是,使用Mock()Stub()Spy() 创建的测试替身完全基于代理,因此无法拦截最终方法。

    由于您的测试代码是用 Groovy 编写的,您可以使用 GroovyMock() 代替,这样可以解决问题。

    PS:1 * foo.getBar()1 * foo.bar 都是有效的符号。

    PPS:如果你有一个具体的原因(模拟最终方法,模拟动态方法等),只喜欢GroovyMock() 而不是Mock()。详情请见reference documentation

    【讨论】:

      猜你喜欢
      • 2014-06-24
      • 1970-01-01
      • 2017-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-22
      • 1970-01-01
      相关资源
      最近更新 更多