【问题标题】:Could be this condition evaluated to "true" in any case?在任何情况下都可以将这种条件评估为“真”吗?
【发布时间】:2018-05-11 08:19:02
【问题描述】:

我必须重构一些遗留代码,我已经开始做一些测试。这是正在测试的方法:

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”

【问题讨论】:

  • 那是什么语言?看起来像 Java,但我看不出像 "yyyy".format(date) 这样的东西甚至应该如何编译。另外,我看不出有任何理由让该方法同步。
  • @RobbyCornelissen 抱歉,我为这个问题更改了一些代码。已编辑!
  • 您可以编写一个循环来测试过去 10 年左右的 all 日期,而不是手动选择几个“随机”日期。这很容易找到反例。之后,您可以保留边界案例反例以及介于两者之间的一些随机日期作为应保留的测试。

标签: java unit-testing refactoring code-coverage


【解决方案1】:

不,您不能安全地删除该代码。新年第一周的年末日期将符合该条件。

考虑以下情况,在 2017 年 12 月 31 日,您最终会得到 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周年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

在单元测试中,您应该首先解决边界情况。像一年中的第一天和最后一天这样的日期绝对可以作为边界案例。

【讨论】:

  • 感谢您的回答。但是,在您的示例中,我得到的不是“201801”,而是“201752”
  • 我认为输出的差异可能与时区有关。约会2015/12/31得到什么?
  • 如果我使用 2018/12/31,它可以正常工作:它返回 201901。很好,非常感谢!
  • 是的,就是这样!谢谢;D
猜你喜欢
  • 2013-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-05
  • 1970-01-01
  • 1970-01-01
  • 2022-11-14
  • 1970-01-01
相关资源
最近更新 更多