【问题标题】:Spock - setup spec with groovy trait and @BeforeClassSpock - 具有 groovy 特征和 @BeforeClass 的设置规范
【发布时间】:2020-02-12 10:33:32
【问题描述】:

我试图设置一个通用的对象数组,这些对象从资源中的 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,它就会以某种方式工作......

【问题讨论】:

  • 感谢您提出有趣的问题。请注意了解MCVE 是什么,并始终尝试提供一个。它比没有类定义、包名、导入等的不连贯的 sn-ps 集要好得多。每个试图重现您的问题的人都必须创建自己的(可能是错误的)设置版本。看看马克在他的回答中是如何做到的,并向他和我链接的文章学习。谢谢。
  • 好的,谢谢您的提示 - 我会记住这一点以备将来使用。

标签: groovy junit traits spock


【解决方案1】:

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

  • 在 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注解出现在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]
    }
}

【讨论】:

  • 谢谢 - 在跟踪 Spock 文档和关于 @Shared 注释和特征问题的常规开放问题后,我得出了相同的结论;)
猜你喜欢
  • 1970-01-01
  • 2016-08-11
  • 2021-03-01
  • 1970-01-01
  • 2020-07-20
  • 1970-01-01
  • 2015-08-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多