Как проверить условия истечения? - PullRequest
2 голосов
/ 01 августа 2011

Я разрабатываю компонент, который предоставляет токены, которые имеют ограниченный срок службы и не требуют сохранения в случае перезапуска приложения.Следовательно, токены хранятся только в памяти.Каждый токен идентифицируется ключом и имеет соответствующее время жизни, после которого токен истекает и больше не может использоваться.

Я остановился, чтобы подумать, как бы вы протестировали работу условий истечения в соответствии с планом?

  1. Наивная реализация, использующая System.currentTimeMillis, не обеспечивает надлежащего способа ввода произвольного времени.для проверки границ.
  2. Добавление параметра datetime (Calendar, Joda-Time DateTime и т. д.) в соответствующие методы не имеет смысла вне контекста тестирования, так как это не входит в обязанности вызывающей стороны.знать, который час.
  3. Завершение системного времени в классе, который можно вводить и высмеивать, кажется правильным, но кажется немного громоздким.Это также потребовало бы использования другого конструктора, так как реализации по умолчанию достаточно во всех случаях, кроме тестирования.
  4. Определение продолжительности жизни в качестве параметра позволило бы сделать ожидание достаточно коротким, чтобы сделать sleep() или ожидание занятости разумным и надежным решением

В настоящее время я склоняюсь квариант 4, но я бы также узнал о большем количестве вариантов!

Слишком упрощенный сценарий с набросками:

private static final long LIFE_SPAN = 60000;
private Map<T, Long> bestBeforeDates = new HashMap<T, Long>();

public void add(final T key) {
   bestBeforeDates.put(key, System.currentTimeMillis() + LIFE_SPAN);
}

public boolean isExpired(final T key) {
  // How to make this fail without waiting for x milliseconds
  return bestBeforeDates.get(key) < System.currentTimeMillis();    
}

1 Ответ

3 голосов
/ 01 августа 2011

Вариант 3 - лучший ИМО.Получение текущего времени является услугой, как и любой другой, IMO.Легко написать Clock интерфейс, а затем подделать его соответствующим образом.Если вы используете достойную DI-среду, вам не нужен другой конструктор - просто привяжите системную реализацию к интерфейсу Clock, и никаких дополнительных изменений не требуется.

Я использовал этот подход вколичество мест и никогда не жалел об этом.Конечно, это зависит от того, используете ли вы инъекцию зависимости в другом месте - если вы вводите зависимость only , это скорее боль.

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