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