在斯波克惩戒超#()方法

在斯波克惩戒超#()方法

问题描述:

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$是从哪里来的,也许这就是继承关系或者什么,我想如果你试试这个,你可能会有不同的数字。

+1

意外的解决方案:)它在不同的编译器上稳定吗? –

+0

好问题,我想这可能不是。但只要你把所有东西都包括在编译器版本中,它应该是可重现的。一旦改变了这种方式,你可以找到新的格式。这绝对是无证的功能,使用它会带来后果。 – Dmytro

只是如果你想嘲笑的想法只有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