2

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

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

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

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

但是,如果可能的话,我想在 JRE 1.4 环境下以模拟的方式来做。

谢谢

4

5 回答 5

2

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

于 2011-08-28T15:25:51.050 回答
1

除了 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;
        }
    }
}

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

于 2011-08-23T20:32:45.013 回答
0

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

于 2011-03-10T08:18:38.437 回答
0

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

于 2011-03-10T08:32:47.683 回答
0

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

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

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

于 2011-03-10T06:44:11.537 回答