Можно ли изменить текущее время потока или экземпляра jvm в Java? - PullRequest
5 голосов
/ 29 августа 2010

Я хочу протестировать некоторые методы класса, которые содержат логику, зависящую от текущего времени, когда он работает.Я хотел бы установить для потока / jvm / system time определенную будущую дату в настройке JUnit и запустить мои тесты.Также я хотел бы, чтобы это было временно.Кто-нибудь делал это раньше?

Я думал о чем-то похожем на TimeZone.setDefault (часовой пояс)

Ответы [ 4 ]

4 голосов
/ 29 августа 2010

Вы можете использовать AspectJ и обернуть методы вокруг java.lang.System.currentTimeMillis(), java.util.Date.new() и java.util.Calendar.getInstance(), которые регулируют время в соответствии с вашими потребностями.

2 голосов
/ 29 августа 2010

Я тоже с этим боролся. Лучшее решение, которое я нашел до сих пор, - это наличие класса TimeHelper, который управляет вещами времени: как фабрика Date, хранит DateFormatters и так далее, чтобы эти вещи не распределялись по базе кода.

С помощью Easymock или другого фальшивого фреймворка легко протестировать материал, связанный со временем.

2 голосов
/ 29 августа 2010

Я не верю, что есть способ сделать это, используя java.util.Date.

Если вы используете joda-time, тогда можете. См это

0 голосов
/ 29 августа 2010

Вы идете об этом неправильно.Ваши методы класса должны принимать значение long, которое представляет время - они не должны принимать TimeZone.Если вы реорганизуете ваши методы, чтобы отделить их от того факта, что они получают «время» от TimeZone, то вы можете легко протестировать свои методы, не делая того, что вы пытаетесь сделать сейчас;вы просто вызываете ваши методы с заранее определенными long значениями, представляющими определенное время, вместо того, чтобы вызывать их с TimeZone объектом, значение по умолчанию которого является чем-то предопределенным, что вы хотите проверить.

Вам необходимо отделить методы, которые получают параметр «время» от источника, который предоставляет это значение времени.Делая это, вы можете запустить свой код, используя TimeZone или текущее системное время, и вы можете проверить свой код, используя предопределенные значения времени, которые вы хотите проверить.

Пойдите и попробуйте рефакторинг вашего кода и посмотрите, сможете ли вы достичь желаемых возможностей - вы должны это сделать.Возвращайтесь с любыми дополнительными вопросами, и мы будем рады помочь!

Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...