Java 为什么我的Junit测试一次都运行失败?

Java 为什么我的Junit测试一次都运行失败?,java,junit,Java,Junit,我有很多Junit测试。当我通过右键单击每个类来单独运行它们,然后以->Junit test的方式运行时,它们都通过了。但是,如果我单击一个包或单击src/test/java同时运行所有包,其中许多包都会失败,一些包会通过 这正常吗 根据我的经验,这表明测试没有正确地自我清理。例如,如果您有任何调用静态方法的测试,那么这些静态调用可能会以影响未来测试的方式更改静态对象的状态。对于静态成员,只有一个实例存在,因此当测试运行时,它们都将使用相同的实例。因此,当单独运行时,它们可能工作得很好,因为它们

我有很多Junit测试。当我通过右键单击每个类来单独运行它们,然后以->Junit test的方式运行时,它们都通过了。但是,如果我单击一个包或单击src/test/java同时运行所有包,其中许多包都会失败,一些包会通过


这正常吗

根据我的经验,这表明测试没有正确地自我清理。例如,如果您有任何调用静态方法的测试,那么这些静态调用可能会以影响未来测试的方式更改静态对象的状态。对于静态成员,只有一个实例存在,因此当测试运行时,它们都将使用相同的实例。因此,当单独运行时,它们可能工作得很好,因为它们使用处于原始状态的静态对象,但是当作为套件的一部分运行时,其他一些测试可能与静态对象交互,从而导致代码在后续测试中以不同的方式运行


因此,在这种情况下,您可以添加@After或@AfterClass方法,该方法将重置运行测试时可能已更改的任何内容。

您的测试可能取决于其他测试的结果。如果是这样的话,您应该改变这一点,因为单元测试应该彼此独立。或者,如果您使用的是成员变量,则一个测试可以改变另一个测试预期处于特定状态的成员变量。您可以使用“@Before”和“@After”在每个测试前后设置变量。不,它不依赖于其他测试。失败的原因似乎是hashset中断言的字符串值的不同输出顺序。它们实际上是一样的。然而,我不明白为什么在没有问题的情况下单独运行。全部通过。@blur0224,所有测试的作用都是获取函数返回的值变量。这就是您正在谈论的成员变量吗?如果没有看到代码或完整的可复制示例,很难判断。您必须小心测试之间共享对象的状态。我会在debug上运行测试,并比较该方法在运行单个测试和所有测试时返回的结果。如果确实如此,这是否意味着在我的代码中使用静态变量有问题?不一定,但可能有问题。这可能只是意味着测试需要清理,以免污染未来的测试。或者,它可能表示代码将以某种方式与静态变量交互,从而导致与同样与同一静态成员交互的其他代码出现问题。实际上,如果没有看到所有的测试和所有的代码,几乎不可能确定地说。但我建议您找到所有单元测试都可以调用静态方法的情况,并考虑这些是否会引起将来测试的污染。谢谢。我会的。