Junit для Java часов без каких-либо дополнительных классов или конструктора или инъекций - PullRequest
0 голосов
/ 19 октября 2018

У меня есть метод ниже

public long printDate(ZonedDateTime otherDate){
   LocalDateTime ldt = LocalDateTime.now(Clock.systemDefaultZone());
   ZonedDateTime now = ldt.atZone(ZoneId.of("America/New_York"));
   Duration dur = Duration.between(otherDate, now);
   long seconds = dur.getSeconds();
   return seconds;
}

Я хочу написать Junit для этого метода, но я не понимаю, как смоделировать Clock.fixed(...) для разных времен.

есть ли способпротестировать указанный выше метод без использования Clock в качестве параметра метода или без инициализации в конструкторе Clock или без использования какого-либо дополнительного служебного класса.

1 Ответ

0 голосов
/ 19 октября 2018

Мой совет: даже не пытайтесь.Статический доступ почти всегда является препятствием для тестируемого кода.Не приобретайте Clock статическим методом.Вместо этого создайте Clock.systemDefaultZone() вне этого метода и вставьте его либо в качестве параметра метода, либо с помощью внедрения конструктора / установщика в класс этого метода (именно так, как вы говорите, вы не хотите делать!)

Затем вы можете предоставить все, что вам нравится Clock для ваших модульных тестов.

Весь смысл класса Clock в том, что вы можете сделать это!Все дело в том, что Clock может быть введен, тогда как статические вызовы, такие как new Date() или System.currentTimeMillis(), не могут.

Если вам абсолютно необходимо протестировать код, который использует статические методы, Powermock или аналогичный может помочь сэтот.На мой взгляд, кроме унаследованного кода, чьи зависимости вы не можете убрать, это почти никогда не понадобится.

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