Spock-具有groovy特性和@BeforeClass的安装规范

问题描述 投票:0回答:1

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

特质:

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,则可以正常工作...

groovy junit traits spock
1个回答
0
投票

我建议以一些“ spock”​​ -y的方式重写一些小错误:

  • 在spock中,您应该使用def setupSpec()固定方法而不是@BeforeClass
  • 如果要在setupSpec中初始化一个变量,而该变量实际上对于所有测试用例仅运行一次,则应在字段上放置@Shared批注。

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

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

它仍然不起作用。现在,看来您在spock中遇到了一个未解决的问题:

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

此问题尚待解决,但是存在解决方法,并且在讨论中提出了建议:使用静态一词(您实际上已经做到了:))。原因:@Shared批注出现在特征中时,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]
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.