В 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, но иметь возможность иметь этот один объект, чтобы увидеть два разных значения часов (как если бы это был обычный системный тактовый сигнал). Таким образом, я не могу передать фиксированные часы в конструктор.