在 Spock 中模拟 super#method()

Mocking super#method() in Spock

免责声明:有一个问题看起来很相似,但实际上不同:Mocking a Superclass in Spock

例如:

class Bar {
  def method(){
      return 'bar'
  }
}


class Foo extends Bar {
   def method() {    
       super.method() + ' foo'
   }
}

我想单独测试 Foo,即我想模拟 Bar,例如:

def "test"() {
    given:
    def foo = GroovySpy(Foo)

    when:
    def result = foo.method()

    then:
    1 * ((Bar) directive).generate() >> 'mockBar'
    result == 'mockBar foo'
}

这显然行不通,但给出了我正在努力实现的想法。有什么想法吗?

如果你只想模拟的话只是一个想法Bar.method():

class Foo extends Bar {
   def superMethod() {
       super.method()
   }

   def method() {    
       superMethod() + ' foo'
   }
}

你的测试:

def "test"() {
    given:
    def foo = new Foo() {
        @Override
        def superMethod() {
            'mockBar'
        }
    }

    expect:
    foo.method() == 'mockBar foo'
}

我刚刚知道如何做到这一点。

我放了以下内容:

then:
1 * foo.method()
0 * foo._

它给了我在我从 when: 调用之后调用的确切方法,我这样说:

then:
1 * foo.super$method()

我不确定 $ 是从哪里来的,也许是继承级别之类的,我想如果你尝试一下,你可能会有不同的数字。