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]
}
}
我试图设置一个公共对象数组,这些对象是从资源中的 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]
}
}