你好我测试这个有问题,因为我得到一个错误,测试不对,你们可以解释为什么和错误是什么?
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());
}
我想知道我的错误在哪里以及如何修复它们
答案 0 :(得分:1)
一种解决方案是使用java.util
类Date
和Calendar
替换您的自定义日期算术,除非 使用它们(例如这是一个日期计算练习),因为这些实用程序类是标准的并经过充分测试。
为了与Calendar
课程保持一致,我建议使用(年,月,日)格式而不是您的(日期,月份,年份)。这样可以更方便地针对java.util
结果测试您的代码。
因此,在假设您不允许使用Date(date, month, year)
的情况下,使用java.util
格式查看测试用例:
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
。
构造函数中也可能存在问题;它需要测试不符合日历标准的处理日期。