在斯波克惩戒超#()方法
问题描述:
Dislaimer:有可能类似于一个问题,但它实际上是不同的: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'
}
这显然是行不通的,但给我想要实现的想法。有任何想法吗?
答
我刚刚找到了如何做到这一点。
我把有以下几点:
then:
1 * foo.method()
0 * foo._
它给了我什么,我从when:
调用后已被称为精确的方法,我把它像这样:
then:
1 * foo.super$3$method()
我不知道$3$
是从哪里来的,也许这就是继承关系或者什么,我想如果你试试这个,你可能会有不同的数字。
答
只是如果你想嘲笑的想法只有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'
}
+0
这不可爱,但会工作,谢谢。虽然我发现下面更好的方法。 – Dmytro
意外的解决方案:)它在不同的编译器上稳定吗? –
好问题,我想这可能不是。但只要你把所有东西都包括在编译器版本中,它应该是可重现的。一旦改变了这种方式,你可以找到新的格式。这绝对是无证的功能,使用它会带来后果。 – Dmytro