我有一个单元测试类,当单独运行时。当我使用包中的所有其他测试运行它时失败,因为未能初始化独立的静态类。这个独立的静态类被其他类使用,因此似乎在测试之间保持其状态。
我的观察结果是正确还是其他事情发生了?如果有人可以提供链接或其他内容作为参考,也会很好。
谢谢!
答案 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
字段以避免它们的最大原因之一:它会减少您必须担心的全局状态数量,从而减少这使得更容易推理测试。