无法存根 @Shared 字段

Unable to stub @Shared fields

我是 spock 的新手,正在尝试使用一些简单的模拟和存根进行试验。玩了一会儿,我注意到我无法存根或模拟 @Shared 字段。我在文档中找不到任何此类提及。在 setupSpec() 或 setup() 的工作方式中我是否遗漏了什么?

package com.rsa.netwitness.cloud

import spock.lang.Shared
import spock.lang.Specification

class MySpecification extends Specification {

    @Shared MyPojo pojo

    MyPojo pojo2

    def setup(){
        pojo2 = Mock(MyPojo)
    }
    def setupSpec(){
        pojo = Mock(MyPojo)
    }

    def "example 1"(){
        given:
        pojo.getValue() >> "foobar"

        expect: "fails"
        pojo.getValue() == "foobar"
    }

    def "example 2"(){
        given:
        pojo2.getValue() >> "foobarbaz"

        expect: "works"
        pojo2.getValue() == "foobarbaz"
    }

}

class MyPojo {

    public String value ;

    public String getValue(){
        return value ;
    }
}

这应该有效:

class MySpecification extends Specification {

    @Shared MyPojo pojo = Mock(MyPojo)

    def setupSpec(){
        pojo.getValue() >> "foobar"
    }

    def "example 1"(){
        expect: 
        pojo.getValue() == "foobar"
    }
}

class MyPojo {


    public String value ;

    public String getValue(){
        return value ;
    }
}

编辑:

这也行得通:

class MySpecification extends Specification {

    @Shared MyPojo pojo = Mock(MyPojo) {
        getValue() >> 'foobar'
    }

    def "example 1"(){
        expect: 
        pojo.getValue() == "foobar"
    }
}

Spock 不支持此功能,请阅读 this 了解更多信息。

将 mocks/stubs 定义为 @Shared 没有任何好处。此外,如果可以的话,你应该避免使用 @Shared,因为这会破坏测试隔离。仅将其用于创建成本高昂的事物,并尽量避免改变这些事物。