无法存根@Shared字段

时间:2017-11-21 20:46:17

标签: groovy spock

我是spock的新手,并试图尝试一些简单的Mocks和Stubs。在玩一下时,我注意到我无法存根或模拟@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 ;
    }
}

2 个答案:

答案 0 :(得分:1)

Spock不支持此功能,请阅读this以获取更多信息。

将模拟/存根定义为@Shared没有任何好处。此外,如果你可以在休息时测试隔离,你应该避免@Shared。仅用于创建成本高昂的东西,并尽量避免变异。

答案 1 :(得分:0)

这应该有效:

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"
    }
}