Java类测试问题

时间:2014-10-01 21:03:10

标签: java netbeans

你好我测试这个有问题,因为我得到一个错误,测试不对,你们可以解释为什么和错误是什么?

public void addDays(int x) {
    int y = year;
    day = day + x;     
    if (day > 31) {     
      day = day - 31;   
      addMonths(1); 

    } else if (day >= 29 && month == 2 && (isLeapYear(y))) {
      day = day - 29;
      addMonths(1);
    } else if (day >= 28 && month == 2 && !(isLeapYear(y))) {
      {
        day = day - 28;
        addMonths(1);

      }
    }
  }

这是我对此方法的测试(我使用Netbeans)。

     @Test
   public void testAddDays() {
    Date z = new Date(31,11,2013);
    z.addDays(3);
 assertEquals(3, z.getDay());

}  
           @Test
   public void testAddDays1() {
    Date z = new Date(28,2,2016);
    z.addDays(3);
 assertEquals(2, z.getDay());
}  
              @Test
   public void testAddDays2() {
    Date z = new Date(29,2,2014);
    z.addDays(2);
 assertEquals(3, z.getDay());
}  

我想知道我的错误在哪里以及如何修复它们

1 个答案:

答案 0 :(得分:1)

一种解决方案是使用java.utilDateCalendar替换您的自定义日期算术,除非 使用它们(例如这是一个日期计算练习),因为这些实用程序类是标准的并经过充分测试。

为了与Calendar课程保持一致,我建议使用(年,月,日)格式而不是您的(日期,月份,年份)。这样可以更方便地针对java.util结果测试您的代码。


因此,在假设您不允许使用Date(date, month, year)的情况下,使用java.util格式查看测试用例:

  • testAddDays:这会将三天添加到日期(2013年11月31日)。由于2013-11-31不是一个格式良好的日期,构造函数应将其更改为2013-12-01。添加三天是2013-12-04,因此getDay()应返回4.
  • testAddDays1:这会增加三天到达日期(2016年2月28日),这是闰年。接下来的三天是2016-02-29,2016-03-01和2016-03-02,所以getDay()应该返回2.
  • testAddDays2:这会增加两天到日期(2014年2月29日),这是常见的一年。由于2014-02-29不是一个结构良好的日期,构造函数应将其更改为2014-03-01。添加两天是2014-03-03,因此getDay()应返回3.

addDays(int x)方法中的一个明显错误是它不会测试x超过一个月的时间。如果您不担心代码对于大型x来说会很慢,您可以使用以下内容迭代所有月份:

if (x < 0) {
  subtractDays(x);
  return;
}
day += x;
while (day > 0) {
  int daysThisMonth;
  switch (month) {
    case 2: daysThisMonth = isLeapYear() ? 29 : 28; break;
    case 4: case 6: case 9: case 11: daysThisMonth = 30; break;
    case 1: case 3: case 5: case 7: case 8: case 10: case 12: daysThisMonth = 31; break;
    default: // ERROR.
  }
  addMonths(1);
  day -= daysThisMonth;
}

请注意,此代码取决于addMonths()忽略day,这是代码维护问题。我假设还有subtractDays()方法;如果没有,您需要修改addDays()以允许否定x

构造函数中也可能存在问题;它需要测试不符合日历标准的处理日期。