Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.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中更改线程或jvm实例的当前时间?_Java_Testing_Time_Junit - Fatal编程技术网

是否可以在java中更改线程或jvm实例的当前时间?

是否可以在java中更改线程或jvm实例的当前时间?,java,testing,time,junit,Java,Testing,Time,Junit,我想测试一些类方法,它们包含依赖于当前运行时间的逻辑。我想在JUnit设置中将线程/jvm/系统时间设置为一个特定的未来日期,并运行测试。我也希望这是暂时的。以前有人这样做过吗 我在考虑类似于TimeZone.setDefault(TimeZone)的东西,我不相信有一种方法可以使用java.util.Date实现这一点 如果你在利用乔达的时间,那么你可以。请看我也一直在努力解决这个问题。到目前为止,我找到的最好的解决方案是使用一个TimeHelper类来管理时间:作为一个日期工厂,保留日期格式

我想测试一些类方法,它们包含依赖于当前运行时间的逻辑。我想在JUnit设置中将线程/jvm/系统时间设置为一个特定的未来日期,并运行测试。我也希望这是暂时的。以前有人这样做过吗


我在考虑类似于TimeZone.setDefault(TimeZone)

的东西,我不相信有一种方法可以使用java.util.Date实现这一点


如果你在利用乔达的时间,那么你可以。请看

我也一直在努力解决这个问题。到目前为止,我找到的最好的解决方案是使用一个TimeHelper类来管理时间:作为一个日期工厂,保留日期格式化程序等等,这样这些东西就不会分布在代码库中


使用Easymock或另一个模拟框架,测试与时间相关的东西就很简单了。

你做得不对。类方法应该接受表示时间的
long
值-它们不应该接受
时区。如果您重构您的方法,使其与从
时区
接收“时间”的事实分离,那么您可以轻松地测试您的方法,而无需执行您现在尝试执行的操作;您只需使用代表特定时间的预定义
long
值调用方法,而不是使用
时区
对象调用方法,该对象的默认值是您希望测试的预定值

您需要将从提供该时间值的源接收“time”参数的方法解耦。通过这样做,您可以在使用时区或当前系统时间时运行代码,并且可以在使用要测试的预定义时间值时测试代码

继续尝试重构你的代码,看看你是否能达到预期的功能——你应该能够做到。如果您还有任何问题,请回来,我们将很乐意为您提供帮助


祝你好运。

你可以使用AspectJ并围绕
java.lang.System.currentTimeMillis()
java.util.Date.new()
java.util.Calendar.getInstance()
来包装方法,它们根据你的需要调整时间。

线程没有当前时间,对我来说,Joda时间似乎是最简单的解决方案