所以我找到了一个用@FixMethodOrder
对类中的junit测试进行排序的方法,但是阅读我遇到的文档时我不明白:
类中JUnit测试的默认执行顺序是确定性但不可预测。 Java 7(以及一些以前的版本)无法保证执行顺序,甚至可以在运行之间进行更改,因此执行顺序已更改为确定性(在JUnit 4.11中)
在我学习期间,我从未遇到任何确定性和不可预测的算法或系统。只有我能想象的系统才能适应这种复杂系统,比如天气或自然界,因为对于那些我们暂时没有任何具体算法的系统,但是Junit? 有人可以解释一下Junit doc所指的内容吗?
谢谢, 标记
答案 0 :(得分:3)
所有的说法都是该算法定义明确,但它依赖于太多复杂的,不可控制的因素,作为开发人员,可以有效地预测或依赖订单。
根据java.lang.Class
的文档,JVM可以按任意顺序从getMethods()
方法返回方法。因此,首先要注意的是底层算法可能会在JVM版本/实现之间发生变化。
在类文件中布局方法的顺序在JLS中没有严格定义,因此不同编译器编译的同一个类可能会以稍微不同的方法顺序结束,相同的JVM可能会返回不同的方法顺序,即使这个班是一样的。
在JVM中,类信息可能以不保证返回一致顺序的方式存储,甚至可能依赖于JVM在其生命周期中的位置。例如,假设每个方法都存储为java.lang.Method
对象,java.lang.Class
将它们全部存储在Set
中,getMethods()
的顺序依赖于Set
的顺序java.lang.Class.getMethods()
中的对象 - 由于散列而基本上是随机的(或伪随机的)。
尽管JVM的工作方式不完全正确,但它确实使用依赖于实现的数据结构,这使得很难预测像java.lang.Class
这样的方法的返回顺序,并且无法保证JVM实现之间的一致性和/或版本。因此,如果您查看getMethods()
的OpenJDK实现,您会看到<p><strong>Details:
方法是根据许多本机方法实现的。一旦你进入本机代码,你就依赖于特定于实现的因素,例如内存地址,并且正如文档所暗示的那样,JVM不会确保它们的效果完全隐藏在你身上。