我有一个 JUnit 类,用于测试系统中的时钟。时钟有一个方法jump(long milliSeconds
这基本上使时钟跳转到指定的时间,从而设置时钟的实例字段 currentTime
传递给跳转方法的参数。
所以我有三个 JUnit 方法。在第一个中,我只是测试时钟的当前时间是否为 0,因为我没有调用时钟上的任何内容。然后我只是测试使时钟跳转到指定时间一次是否正确反射(reflect)在当前时间上。最后,我调用了几次跳转方法,每次跳转后我都会测试当前时间是否正确。
我遇到的问题是,我的 JUnit 测试有时会通过,有时会失败。假设我运行了上述三个 JUnit 方法一次,并且通过了。没关系。然后,如果我再次运行这三个,那么第一个会失败,因为时钟的当前时间不再是 0,而是当前时间是上次测试中调用的最后一个跳转。
我对此感到困惑,因为我认为在顺序执行所有三个 JUnit 方法之后,如果我再次运行测试,它不会“记住”它做了什么。
那么这是否需要我将 @Before setUp()
中的当前时间初始化为 0 ?问题是上述情况只是有时发生。如果我等待 5 分钟并再次运行它。它运行良好。然后,如果我立即再次运行它,我会得到同样的错误。
这可能与我已将 Clock 类声明为最终类有关吗?或者我已经在其上强制执行了单例设计模式?
最佳答案
您将 Clock 设计为单例:每个类加载器只有一个 Clock 实例:Clock.INSTANCE
。显然,如果某个测试方法影响了时钟的状态,则下一个方法将找到具有此新状态的时钟。
您刚刚重新发现了单例是反模式的原因之一:很难进行单元测试。每个测试都不应该对时钟做出任何假设,并在测试之前将其置于众所周知的初始状态。
或者您可以简单地将 Clock 设计为一个普通的旧 Java 对象,您可以在测试设置中实例化它,并使用 IOC 容器在运行时将 Clock 的唯一实例注入(inject)到您的 bean 中。
另请注意,单元测试应该彼此独立。您可能希望执行所有测试,或仅执行其中一项测试,并且它们应该能够以任何顺序运行。
关于java - 执行 JUnit 方法后会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13442143/