В Java 8 представлен java.time.Clock
, который может использоваться как аргумент для многих других объектов java.time
, позволяя вам вводить в них реальные или поддельные часы. Например, я знаю, что вы можете создать Clock.fixed()
, а затем вызвать Instant.now(clock)
, и он вернет фиксированный Instant
, который вы предоставили. Это звучит идеально для модульного тестирования!
Однако мне трудно понять, как лучше всего это использовать. У меня есть класс, похожий на следующий:
public class MyClass {
private Clock clock = Clock.systemUTC();
public void method1() {
Instant now = Instant.now(clock);
// Do something with 'now'
}
}
Теперь я хочу unit test этот код. Мне нужно установить clock
для создания фиксированных времен, чтобы я мог тестировать method()
в разное время. Ясно, что я мог бы использовать отражение, чтобы установить член clock
на определенные значения, но было бы неплохо, если бы мне не пришлось прибегать к размышлениям. Я мог бы создать общедоступный метод setClock()
, но это не так. Я не хочу добавлять аргумент clock
к методу, потому что реальный код не должен касаться передачи в часах.
Каков наилучший подход для решения этой проблемы? Это новый код, поэтому я могу реорганизовать класс.
Изменить. Чтобы уточнить, мне нужно иметь возможность создать один объект MyClass
, но иметь возможность иметь этот один объект, чтобы увидеть два разных значения часов (как если бы это был обычный системный тактовый сигнал). Таким образом, я не могу передать фиксированные часы в конструктор.