Spock - 使用 groovy 特征和 @BeforeClass 设置规范

Spock - setup spec with groovy trait and @BeforeClass

我试图设置一个公共对象数组,这些对象是从资源中的 json 文件加载和反序列化的,并尝试通过使用 groovy trait 和 setup() 方法来做到这一点。

特质:

Object[] arr

@BeforeClass
def setupTrait() {
   arr = loadFromFile("xxx.json")
}

测试:

def setup() {}

def "test"() {
   arr.size() //here arr is null, although the setup in groovy is called
}

工作解决方案。

特质:

static Object[] arr = loadFromFile("xxx.json")

测试:

def setup() {}

def "test"() {
   arr.size() //here arr is ok.
}

问题是为什么第一个不能正常工作? 如果我使用 @Before 注释并且在每次测试之前加载 arr,它就会以某种方式工作...

有一些小错误,我建议以更 "spock"-y 的方式重写:

  • 在 spock 中你应该使用 def setupSpec() fixture 方法而不是 @BeforeClass
  • 如果你想在 setupSpec 中初始化一个变量,它确实会 运行 对所有测试用例只初始化一次,你应该在字段上放置 @Shared 注释。

但是,即使代码看起来像这样:

trait SampleTrait {
    @Shared List arr
    def setupSpec() {
        arr = [1,2,3]
    }
}

还是不行。现在,您似乎在 spock 中遇到了未解决的问题:

https://github.com/spockframework/spock/issues/83

问题已解决,但存在解决方法,并在讨论中提出了建议:使用静态一词(您实际上已经这样做了:))。原因:@Shared 注解出现在 traits 中时无法被 Spock 处理。

所以,总而言之,我相信你能得到的最好的是:

trait SampleTrait {
    static List arr

    def setupSpec() {
        arr = [1,2,3]
    }
}

class SampleTestSpec extends Specification implements SampleTrait {
    def "list equality"() {
        expect:
          arr == [1,2,3]
    }
}