我有一个单元测试类,当单独运行时.当我使用包中的所有其他测试运行它时失败,因为未能初始化独立的静态类.这个独立的静态类被其他类使用,因此它的状态似乎在测试之间保持不变.
我的观察是正确的还是其他事情发生了?如果有人可以提供链接或某些东西作为参考,那也是好的.
谢谢!
这个独立的静态类被其他类使用,因此它的状态似乎在测试之间保持不变.
是.这就是将要发生的事情.而这只是静力学尴尬的原因之一.
静态字段存在于定义它们的类的生命周期中,这通常意味着JVM的生命周期.我试图在JLS中找到一个明确说明的地方.我能找到的最接近的是JLS 8.3.1.1,它说:
"如果一个字段被声明为静态,那么无论该类最终可以创建多少个实例(可能为零),都只存在该字段的一个化身.静态字段,有时称为类变量,在类是初始化(§12.4)."
在其他地方,JLS说一个类只被初始化一次.
例外是当一个类被卸载时,但这不会发生在这里.或者至少,不是正常/默认的JUnit框架行为.(但是可以这样做:请参阅为不同的JUnit测试使用不同的类加载器?)
如果你担心,没有任何JUnit"魔法"将静态重置为初始状态(但是你定义了它).考虑实施这一点太复杂(太可怕了).
方法没有状态(当然,除非在给定的方法运行时),因此在调用之间没有保存 - 即使对于static
方法也是如此.
任何static
字段都会在JVM执行期间保存其状态(当然,除非代码更改其值).JUnit对其所有测试使用一个JVM,因此,是的,static
字段在测试之间保存状态.
这是人们建议不使用static
可避免它们的字段的最大原因之一:它减少了您必须担心的全局状态量,从而使得更容易推理测试.