当前位置: 首页 > 面试题库 >

@BeforeClass与静态{}

马泓
2023-03-14
问题内容

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

为此,我可以使用

  1. 静态初始化程序块或
  2. 静态方法 @BeforeClass

相互使用有什么好处?


问题答案:

@BeforeClassstatic初始值设定项的语义非常不同。

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

另一方面,@BeforeClass在运行每个类的测试之前运行。如果某个类要经受不同的测试(例如,由于基于继承构建的测试),则static初始化程序将仅针对使用该类的第一个测试运行。这意味着您使测试订单依赖于您永远不需要的东西。

请注意,这两个选项之间的语义差异大于使用@Before测试或使用构造函数之间的语义差异。最后,考虑一下注释的文档价值。它使您的意图更具可读性。

此规则的唯一例外是不可变常数。那些应该在其声明中进行初始化,以使您的代码简洁明了,并尊重编译时间常数。但是,如果您的值是可变的,则根本不要使用static值。同样,在测试中更改的可变值会给测试带来顺序依赖性,这是可以避免的。

TL; DR:使用@BeforeClass



 类似资料:
  • 我们从官方的TestNG文档中了解到: 在调用当前类中的第一个测试方法之前,将运行带注释的方法。 将在运行属于标记中的类的任何测试方法之前运行带注释的方法。

  • 问题内容: 直到几周前,我还以为我知道何时创建字段和方法或。例如,当一个字段(例如另一个类的对象)对于该类的任意数量的对象是唯一的时,应将其设置为。 但是几周后,我读到了有关JVM垃圾收集的信息。 我知道字段永远不会被垃圾收集,并且始终保持在内存中,除非类加载器本身是垃圾收集的。 但是,如果我不创建该字段,至少它将被垃圾回收。 因此,在使字段/方法静态化与否之间似乎有一条 很细的界限 。 有人可以

  • 问题内容: Java中的静态和非静态枚举有什么区别?两种用法是相同的。 正确吗 所有静态的都在启动时加载到内存中,非静态的则按需加载 ? 如果是,那么哪种方法更好?将某些数据始终保留在内存中还是每次使用服务器资源加载它们? 问题答案: 所有的都是有效的。如果您有嵌套的枚举,则它与相同。 所有类都是延迟加载的(枚举或其他),但是在加载时,它们会一次全部加载。也就是说,您不能加载一些常量,而不能加载其

  • 问题内容: 我已经定义了一个对象并声明了一个静态变量。在该方法中,当我尝试打印实例和类变量时,两者都打印相同的值。 不是实例变量吗?它应该打印0而不是50吗? 问题答案: 不,只有一个变量-您尚未声明任何实例变量。 不幸的是,Java允许您访问静态成员,就像通过相关类型的引用访问静态成员一样。这是IMO的设计缺陷,某些IDE(例如Eclipse)允许您将其标记为警告或错误- 但这是语言的一部分。您

  • JUnit中带有@Test注释的测试可以以毫秒为单位设置超时,例如: 然而,我似乎找不到一种方法来设置超时(或@BeforeClass)。 还有其他明智的方法吗?我想知道@BeforeClass是否有某种原因不能超时? 我想这样做: 编辑:添加“静态”

  • 我想在所有测试之前在我的数据库中插入一次。这就是我在setUp()方法中尝试做的事情。但是得到了nullpointer。Spring boot版本是1.5.1.发行版。有什么想法吗?这是来自我的测试类: