[我正在尝试设置对象的通用数组,这些对象从资源中的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,则可以正常工作...
我建议以一些“ spock” -y的方式重写一些小错误:
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]
}
}