Может ли это условие быть оценено как "истинное" в любом случае? - PullRequest
0 голосов
/ 11 мая 2018

Мне нужно провести рефакторинг некоторого устаревшего кода, и я начал с некоторых тестов. Это тестируемый метод:

public static synchronized String getWeekFromDate(Date date) {
    String strYyear = new SimpleDateFormat("yyyy").format(date);
    String strMonth = new SimpleDateFormat("MM").format(date);
    String strWeek = new SimpleDateFormat("ww").format(date);
    int month = Integer.parseInt(strMonth);
    if (month > 1 && "01".equals(strWeek)) {
        int year = Integer.parseInt(strYyear);
        return (year + 1) + "01";
    }
    return new SimpleDateFormat("yyyyww").format(date);
}

Я написал пять тестовых случаев, и все зелено. Теперь я хочу провести рефакторинг. Состояние if (month > 1 && "01".equals(strWeek)) не имеет смысла для меня. Это можно прочитать как:

Учитывая дату, это верно, когда месяц не январь, а неделя первый в этом году

Я прав? Имеет ли это смысл? Я уверен, что могу удалить этот кусок кода без последствий.

Мои тестовые наборы (все зеленые):

  • Учитывая 2018-01-03, он должен возвращать "201801"
  • Учитывая 2018-02-01, он должен возвращать "201805"
  • Учитывая 2018-08-15, он должен возвращать "201833"

1 Ответ

0 голосов
/ 11 мая 2018

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

Рассмотрим следующий случай, когда 31 декабря 2017 года вы получите строку результата:201701:

Date date = new SimpleDateFormat("yyyy/MM/dd").parse("2017/12/31");

String weekYear = new SimpleDateFormat("yyyyww").format(date);

System.out.println(weekYear); // "201701" - WRONG

Однако существует гораздо более элегантное решение, чем тот код, который вы используете в настоящее время, полагаясь на SimpleDateFormat год недели * 1011Шаблон * (Y вместо y):

Date date = new SimpleDateFormat("yyyy/MM/dd").parse("2017/12/31");

String weekYear = new SimpleDateFormat("YYYYww").format(date);

System.out.println(weekYear); // "201801" - CORRECT

В модульном тестировании вы должны прежде всего обратиться к граничным случаям.Даты, такие как первый и последний день года, определенно будут рассматриваться как пограничные случаи.

...