gpt4 book ai didi

java - @BeforeClass 与静态{}

转载 作者:IT老高 更新时间:2023-10-28 21:00:39 25 4
gpt4 key购买 nike

我正在使用 JUnit 编写一些测试用例。我需要初始化一些静态变量,这些变量将用于该类中的所有测试用例。

为此我可以使用任何一个

  1. 静态初始化 block 或
  2. @BeforeClass
  3. 的静态方法

使用一个比另一个有什么优势?

最佳答案

@BeforeClassstatic 初始化器有非常不同的语义。

静态初始化程序由 JVM 而不是 JUnit 调用。如果在静态初始化程序中抛出异常,测试框架可能无法捕获和报告异常。此外,与 @BeforeClass 方法相比,静态初始化程序的调用时间没有明确定义。它将在其第一次实际使用每个类加载器仅运行一次,例如访问静态属性、静态方法或其构造函数之一。有时,可能很难弄清楚这将是什么时候。 (如果您不使用继承:您可能有一天或某个同事会重构您的测试用例。如果不是今天,则选择静态初始化器可能会在未来引入令人讨厌的错误。)

另一方面,@BeforeClass 在每个类的测试运行之前运行。如果一个类会受到不同的测试,例如由于基于继承的测试,则 static 初始化程序将仅在使用该类的第一个测试时运行。这意味着您的测试订单取决于您永远不想要的东西。

请注意,这两个选项之间的语义差异大于使用 @Before 或构造函数进行测试之间的差异。作为最后一个论点,请考虑注释的文献值(value)。它使您的意图更具可读性。

此规则的唯一异常(exception)是不可变常量。这些应该在他们的声明中初始化,以保持您的代码简洁并尊重compile time constants。 .但是,如果您的值是可变的,则根本不应该使用 static 值。同样,在测试中更改的可变值会为您的测试引入顺序依赖性,这是要避免的。

TL;DR:使用 @BeforeClass!

关于java - @BeforeClass 与静态{},我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15493189/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com