JUnit - 静态类是否在测试类之间维护状态?

时间:2014-03-27 03:04:00

标签: java junit

我有一个单元测试类,当单独运行时。当我使用包中的所有其他测试运行它时失败,因为未能初始化独立的静态类。这个独立的静态类被其他类使用,因此似乎在测试之间保持其状态。

我的观察结果是正确还是其他事情发生了?如果有人可以提供链接或其他内容作为参考,也会很好。

谢谢!

2 个答案:

答案 0 :(得分:7)

  

这个独立的静态类被其他类使用,因此似乎在测试之间保持其状态。

是。这就是将要发生的事情。这只是静力学尴尬的原因之一。

静态字段存在于定义它们的类的生命周期中,这通常意味着JVM的生命周期。我试图在JLS中找到一个明确说明的地方。我能找到的最接近的是JLS 8.3.1.1,其中说:

  

“如果一个字段被声明为静态,那么无论该类最终可以创建多少个实例(可能为零),都只存在该字段的一个化身。静态字段,有时称为类变量,在初始化类时(第12.4节)化身。“

在其他地方,JLS说一个类只被初始化一次。

例外是当一个类被卸载时,但这不会发生在这里。或者至少,不是正常/默认的JUnit框架行为。 (但可以这样做:见Using different classloaders for different JUnit tests?

如果你担心,没有任何JUnit“魔法”将静态重置为初始状态(不过你定义了)。考虑实施这一点太复杂(太可怕了)。

答案 1 :(得分:5)

方法没有状态(当然,除非在给定的方法运行时),因此在调用之间没有保存 - 即使对于static方法也是如此。

任何static字段在JVM执行期间保存其状态(当然,除非代码更改其值)。 JUnit对其所有测试使用一个JVM,因此,是的,static字段在测试之间保存状态。

这是人们建议不使用static字段以避免它们的最大原因之一:它会减少您必须担心的全局状态数量,从而减少这使得更容易推理测试。