java - 执行 JUnit 方法后会发生什么?

标签 java junit singleton

我有一个 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/

相关文章:

java - RAP 应用程序单例

java - 在 Swing GUI 中提供空白

java - 我们需要Java++吗?

spring - 在 Junit 测试中使用来自 WEB-INF 的 i18n 资源

ios - 单例设计模式以及不同类型之间的区别?

java - 从 Java 访问 scala.None

java - 未设置密码时如何连接 JDBC postgres 连接而无需密码

java - 如何使用 Nimbus Laf 更改内部框架的 "minimize, maximize and close"图标?

java - 什么是 Mockito 等价于 expect().andReturn().times()

java - Junit toString 部分覆盖