манипулировать текущим временем в модульном тестировании? - PullRequest
6 голосов
/ 02 августа 2009

Есть ли способ манипулировать текущим временем в тесте jUnit 4.5? У меня есть следующий метод, который я хотел бы пройти модульный тест для

public String getLastWeek() {
  GregorianCalendar c = new GregorianCalendar(TimeZone.getTimeZone("Europe/Stockholm"));
  c.setFirstDayOfWeek(GregorianCalendar.MONDAY);
  c.add(GregorianCalendar.WEEK_OF_YEAR, -1);
  return c.get(GregorianCalendar.YEAR) + " " + c.get(GregorianCalendar.WEEK_OF_YEAR);
}

Один из способов облегчить тестирование - это разбить его на два метода

public String getLastWeek() {
  GregorianCalendar c = new GregorianCalendar(TimeZone.getTimeZone("Europe/Stockholm"));
  return getLastWeekFor(c);
}

public String getLastWeekFor(GregorianCalander c) {
  c.setFirstDayOfWeek(GregorianCalendar.MONDAY);
  c.add(GregorianCalendar.WEEK_OF_YEAR, -1);
  return c.get(GregorianCalendar.YEAR) + " " + c.get(GregorianCalendar.WEEK_OF_YEAR);
}

Это позволяет мне проверить логику вычитания недели, но оставляет getLastWeek без проверки, и я предпочитаю использовать только один метод для этого.

Ответы [ 3 ]

6 голосов
/ 02 августа 2009

У вас нет реального способа манипулирования системным временем.

На самом деле, вы довольно хорошо провели рефакторинг метода, чтобы сделать его тестируемым. Я бы так и оставил.

3 голосов
/ 02 августа 2009

Здесь я вижу два пути.

Либо создайте фабричный класс DateUtils, который инкапсулирует конструкцию экземпляров Calendar и Date. Тогда вы можете поменять это на контролируемую фабрику. То есть, у вас есть вторая реализация DateUtils, которая также предоставляет метод setCurrentTime, а затем будет явно возвращать Calendar экземпляров, установленных на эту дату.

Или вы можете использовать JMockit, чтобы фактически «переопределить» ваш вызов new GregorianCalendar, поэтому вместо этого возвращается ложный экземпляр. Я сам этого не делал, но здесь есть описание .

Ваша опция, разбивающая метод на два метода, также является совершенно допустимой. Я думаю, что это то, что делает большинство людей, в том числе и я, но правда в том, что это вредит вашему дизайну, особенно если класс подвергается воздействию другого кода.

1 голос
/ 02 августа 2009

Похоже, вы пытаетесь воссоздать то, что делает JODA Time. Я процитирую это на случай, если вы не знаете. Вы можете найти компромисс между переизобретением колеса и добавлением зависимости.

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