Переопределите Java System.currentTimeMillis для тестирования чувствительного ко времени кода - PullRequest
114 голосов
/ 04 января 2010

Есть ли способ, либо в коде, либо с аргументами JVM, переопределить текущее время, представленное с помощью System.currentTimeMillis, кроме ручного изменения системных часов на хост-компьютере?

Немного фона:

У нас есть система, которая запускает несколько заданий бухгалтерского учета, которые вращают большую часть своей логики вокруг текущей даты (т.е. 1-го числа месяца, 1-го числа года и т. Д.)

К сожалению, многие устаревшие коды вызывают такие функции, как new Date() или Calendar.getInstance(), которые в конечном итоге вызывают до System.currentTimeMillis.

В целях тестирования прямо сейчас мы застряли с ручным обновлением системных часов, чтобы манипулировать временем и датой, когда код считает, что тест выполняется.

Итак, мой вопрос:

Есть ли способ переопределить то, что возвращает System.currentTimeMillis? Например, чтобы сказать JVM автоматически добавлять или вычитать некоторое смещение перед возвратом из этого метода?

Заранее спасибо!

Ответы [ 11 ]

0 голосов
/ 12 августа 2015

Если вы хотите смоделировать метод с аргументом System.currentTimeMillis(), вы можете передать anyLong() класса Matchers в качестве аргумента.

P.S. Я могу успешно выполнить мой контрольный пример с помощью описанного выше трюка и просто поделиться более подробной информацией о своем тесте, в котором я использую платформы PowerMock и Mockito.

...