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