【问题标题】:Mocking the current time with JRE 1.4使用 JRE 1.4 模拟当前时间
【发布时间】:2011-03-10 06:04:02
【问题描述】:

我目前仅限于使用 JRE 1.4(java 运行时环境),并且我有一个具有一些当前时间计算的类。我正在尝试对该类进行单元测试,但这似乎很难,因为我遇到的所有模拟工具都需要 JRE1.4 不支持的注释。

我曾尝试使用 JRE 1.4 友好版本的 mockito,但这不允许我模拟静态类。 Jmockit 有一个超级简单的解决方案可供下载,但似乎没有 JRE1.4 友好的 Jmockit 版本

如果我使用 JRE1.5 及更高版本(模拟出调用当前时间的方法或只是模拟出当前系统时间),有两种方法可以解决这个问题,但遗憾的是我不是。

对此的唯一解决方案是将当前系统时间传递给带有 +/- 天/月/年的方法。

但是,如果可能的话,我希望在 JRE 1.4 环境下使用模拟方式。

谢谢

【问题讨论】:

    标签: java unit-testing mocking jmockit


    【解决方案1】:

    为什么不简单地将 Java 5 仅用于测试代码?使用一个不错的 IDE,您应该能够为测试代码(Java 5+)和生产代码(Java 1.4)拥有单独的模块/项目。

    【讨论】:

      【解决方案2】:

      除了 Zsolt 的解决方案(创建包装器)之外,另一种可能的解决方案是提取对方法的调用,然后针对覆盖该方法的子类进行测试。

      要测试的代码:

      class A{
          protected long now(){
              return System.currentTimeMillis();
          }
      }
      

      单元测试:

      class ATest{
          public void testStuff(){
              // actual test
          }
      
          class MyA extends A {
              long currentTime;
      
              protected long now(){
                  return currentTime;
              }
          }
      }
      

      我更喜欢包装方法,但在某些情况下子类化可能有用。

      【讨论】:

      • @yoshi594 在写完我的之后,我已经阅读了关于 Zsolt 答案的 cmets。由于您无法更改代码,因此此解决方案也不起作用。对不起。
      【解决方案3】:

      我建议在处理静态方法时使用包装器。例如,在您的情况下,您可以使用 TimeWrapper:

      public class TimeWrapper() {
          public long getCurrentTimeInMillis() {
              return System.currentTimeMillis();
          }
      }
      

      注入TimeWrapper,当您必须在其他类中获取当前时间时。此解决方案不依赖于 mocking 框架和 jdks。

      【讨论】:

      • 好吧,我忘了说我只是对类进行单元测试,而不是更改里面的代码。我之前尝试做的是将调用当前时间的方法子类化并在需要时注入它,但它仍然调用原始方法。
      • 我明白了。如果您无法更改代码,请使用 @UWe 的解决方案并尝试使用 easymock。另一方面,混合模拟框架是不明智的(一个原因是它们可能使用不同的 JUnitRunner,这会使您的测试代码难以阅读和维护),因此如果您决定使用 easymock,您可能必须转换您的旧的测试用例。
      • 是的,我会尝试使用简单的模拟。会让你们知道我是否成功 =)
      【解决方案4】:

      easymock 不需要注解,因此它适用于 1.4。

      【讨论】:

        【解决方案5】:

        或者为所有与时间相关的方法使用一个特殊的类,比如 DateHelper 然后你可以在你的单元测试中模拟它并通过一个静态变量来改变时间。

        【讨论】:

          猜你喜欢
          • 2020-03-27
          • 1970-01-01
          • 1970-01-01
          • 2011-09-02
          • 2020-11-08
          • 2011-11-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多