Я разрабатываю компонент, который предоставляет токены, которые имеют ограниченный срок службы и не требуют сохранения в случае перезапуска приложения.Следовательно, токены хранятся только в памяти.Каждый токен идентифицируется ключом и имеет соответствующее время жизни, после которого токен истекает и больше не может использоваться.
Я остановился, чтобы подумать, как бы вы протестировали работу условий истечения в соответствии с планом?
- Наивная реализация, использующая
System.currentTimeMillis
, не обеспечивает надлежащего способа ввода произвольного времени.для проверки границ. - Добавление параметра datetime (
Calendar
, Joda-Time DateTime
и т. д.) в соответствующие методы не имеет смысла вне контекста тестирования, так как это не входит в обязанности вызывающей стороны.знать, который час. - Завершение системного времени в классе, который можно вводить и высмеивать, кажется правильным, но кажется немного громоздким.Это также потребовало бы использования другого конструктора, так как реализации по умолчанию достаточно во всех случаях, кроме тестирования.
- Определение продолжительности жизни в качестве параметра позволило бы сделать ожидание достаточно коротким, чтобы сделать
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();
}