Java 用JRE 1.4模拟当前时间
我目前仅限于使用JRE 1.4(java运行时环境),我有一个类,其中包含一些当前时间计算。我试图对这个类进行单元测试,但这似乎相当困难,因为我遇到的所有模拟工具都需要JRE1.4不支持的注释 我曾尝试使用JRE 1.4友好版本的mockito,但这不允许我模拟静态类。Jmockit有一个超级简单的解决方案,可以下载,但似乎没有JRE1.4友好版本的Jmockit 如果我使用JRE1.5及更高版本(模拟调用当前时间的方法或模拟当前系统时间),有两种方法可以解决这个问题,但遗憾的是我没有 唯一的解决方案是将当前系统时间传递到+/-天/月/年的方法中 但是,如果可能的话,我想在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及更高版本(模拟调用当前时间的方法或模拟当前系统时间),有两种方法可以解决这个问题,但遗憾的是我没有 唯一的解
谢谢我建议在处理静态方法时使用包装器。例如,在您的案例中,您可以使用时间包装器:
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答案上的评论。由于您无法更改代码,因此此解决方案也不起作用。很抱歉