У меня есть класс, где я вычислить разницу в годах между текущей датой (now
) и некоторыми другими датами (birthday
):Почему это Joda-Time связано с ошибкой иногда?
import java.util.Date;
import org.joda.time.LocalDate;
import org.joda.time.Years;
public class Logic {
private final Date now;
public Logic(final Date curDate) {
now = curDate;
}
[...]
protected int getAgeInYears(final Date now, final Date birthday) {
final LocalDate nowDate = new LocalDate(now.getTime());
final LocalDate birthdayDate = new LocalDate(birthday.getTime());
return Years.yearsBetween(birthdayDate, nowDate).getYears();
}
}
Тогда у меня есть юнят тесты, которые проверяют getAgeInYears
:
public class SomeTest {
@Test
public void test() {
final LocalDate now = new LocalDate(2015, 8, 28);
final Logic objectUnderTest =
new Logic(now.toDate());
final LocalDate birthDay1 = new LocalDate(2015 - 7, 8, 28);
Assert.assertEquals(6,
objectUnderTest.getAgeInYears(now.toDate(), birthDay1.toDate())); // This assertion fails sometimes, but not always
final LocalDate birthDay2 = new LocalDate(2015 - 7, 8, 27);
Assert.assertEquals(7,
objectUnderTest.getAgeInYears(now.toDate(), birthDay2.toDate()));
final LocalDate birthDay3 = new LocalDate(1981, 4, 24);
Assert.assertEquals(34,
objectUnderTest.getAgeInYears(now.toDate(), birthDay3.toDate()));
}
}
утверждение
Assert.assertEquals(6,
objectUnderTest.getAgeInYears(now.toDate(), birthDay1.toDate()));
не удается иногда.
На моей машине тест проходит без ошибок. На одном из серверов сборки (Java 6) этот тест завершился неудачно. Когда я перестроил код локально с помощью Java 6, тест не сработал.
Что может вызвать это странное поведение?
Обновление 1: Сообщение об ошибке expected:<6> but was:<7>
.
Update 2: я переписал код, чтобы избавиться от toDate
звонков и получил это:
public class Logic {
private final LocalDate now;
public Logic(final LocalDate curDate) {
now = curDate;
}
[...]
protected int getAgeInYears(final LocalDate now, final LocalDate birthday) {
final LocalDate nowDate = new LocalDate(now);
final LocalDate birthdayDate = new LocalDate(birthday);
return Years.yearsBetween(birthdayDate, nowDate).getYears();
}
}
public class LogicTest {
@Test
public void getAgeInYearsSunnyDay() {
final LocalDate now = new LocalDate(2015, 8, 28);
final AdditionalServicesLogic objectUnderTest =
new AdditionalServicesLogic(now);
final LocalDate birthDay1 = new LocalDate(2015 - 7, 8, 28);
Assert.assertEquals(7,
objectUnderTest.getAgeInYears(now, birthDay1));
final LocalDate birthDay2 = new LocalDate(2015 - 7, 8, 27);
Assert.assertEquals(6,
objectUnderTest.getAgeInYears(now, birthDay2));
final LocalDate birthDay3 = new LocalDate(1981, 4, 24);
Assert.assertEquals(34,
objectUnderTest.getAgeInYears(now, birthDay3));
}
}
Теперь я постоянно получаю ошибку утверждение на линии
Assert.assertEquals(6,
objectUnderTest.getAgeInYears(now, birthDay2));
Я ожидаю, чтобы получить 6, но вместо этого получите 7.
Каковы значения (EDIT: _actual_) этих переменных? – Kai
@ user714965 'now = new LocalDate (2015, 8, 28)', 'birthDay1 = new LocalDate (2015 - 7, 8, 28)' –
Вот как вы их инициализируете. Я хотел бы призвать вас, возможно, напечатать фактические значения в тестовом журнале. – Kai