Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用JRE 1.4模拟当前时间_Java_Unit Testing_Mocking_Jmockit - Fatal编程技术网

Java 用JRE 1.4模拟当前时间

Java 用JRE 1.4模拟当前时间,java,unit-testing,mocking,jmockit,Java,Unit Testing,Mocking,Jmockit,我目前仅限于使用JRE 1.4(java运行时环境),我有一个类,其中包含一些当前时间计算。我试图对这个类进行单元测试,但这似乎相当困难,因为我遇到的所有模拟工具都需要JRE1.4不支持的注释 我曾尝试使用JRE 1.4友好版本的mockito,但这不允许我模拟静态类。Jmockit有一个超级简单的解决方案,可以下载,但似乎没有JRE1.4友好版本的Jmockit 如果我使用JRE1.5及更高版本(模拟调用当前时间的方法或模拟当前系统时间),有两种方法可以解决这个问题,但遗憾的是我没有 唯一的解

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

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

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

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

但是,如果可能的话,我想在JRE 1.4环境下用模拟的方式来实现


谢谢

我建议在处理静态方法时使用包装器。例如,在您的案例中,您可以使用时间包装器:

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

当必须在其他类中获取当前时间时,插入
时间包装器。此解决方案不依赖于模拟框架和JDK。

不需要注释,因此它将与1.4一起使用。

或对所有与时间相关的方法(如DateHelper)使用特殊类 然后,您可以在UnitTests中对此进行模拟,并通过静态变量更改时间。

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

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

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

我忘了提到我只是对类进行单元测试,而不是更改内部代码。我以前尝试过的是对调用当前时间的方法进行子类化,并在需要时注入该方法,但它仍然调用原始方法。如果您无法更改代码,请使用@UWe的解决方案并尝试easymock。另一方面,混合模拟框架是不明智的(一个原因是它们可能使用不同的JUnitRunner,这会使您的测试代码难以阅读和维护),因此如果您决定使用easymock,您可能必须转换旧的测试用例。是的,我将尝试使用easy mock。会让你们知道我是否成功=)@yoshi594我写了我的答案后,已经读了Zsolt答案上的评论。由于您无法更改代码,因此此解决方案也不起作用。很抱歉