Я надеюсь, что последующее объяснение будет иметь смысл, потому что это странная проблема, с которой мы сталкиваемся и которую трудно описать.
У нас есть проект maven, который получает сборку в hudson и содержит несколько модульных тестов, в которых используются и утверждаются даты. Сервер hudson работает на солярисе. Теперь время от времени (например, в 30% случаев) модульные тесты с использованием дат не выполняются, потому что 3,5 часа вычитаются из указанного времени в модульном тесте, и, следовательно, утверждения начинают сбой. На остальных 70% все работает нормально, хотя в коде ничего не изменилось, и мы запускаем задание hudson несколько раз в час.
Я добавляю следующий код в юнит-тест, чтобы проверить время:
@Test
public void testDate() {
System.out.println("new DateMidnight(2011, 1, 5).toDate();");
System.out.println(new DateMidnight(2011, 1, 5).toDate());
System.out.println(new DateMidnight(2011, 1, 5).toDate().getTime());
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, 2011);
cal.set(Calendar.MONTH, 0);
cal.set(Calendar.DAY_OF_MONTH, 5);
cal.set(Calendar.HOUR, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
System.out.println("cal.getTime();");
System.out.println(cal.getTime());
System.out.println(cal.getTime().getTime());
}
Так что, в основном, он должен печатать одно и то же при использовании jodatime или простого старого Календаря. Это имеет место в 70% пробегов; для остальных 30% я получаю следующие распечатки:
Running TestSuite
new DateMidnight(2011, 1, 5).toDate();
Tue Jan 04 21:30:00 MET 2011
1294173000000
cal.getTime();
Wed Jan 05 12:00:00 MET 2011
1294225200000
Итак, Календарь сохраняет правильную дату и время, но jodatime вычитает 3,5 часа.
Локальные тесты maven никогда не приводят к возникновению этой проблемы, и мы не можем понять, что может быть причиной этого. В частности, мы не можем придумать единственную причину, по которой тесты иногда проходят, а иногда и не проходят, не изменяя ни код, ни параметры сервера, ни настройки.
Кроме того, мы запускаем установку maven с cobertura, что означает, что модульные тесты запускаются дважды. Также бывает, что они проходят первый раз и терпят неудачу во второй раз или наоборот, или что они терпят неудачу оба раза.
Спасибо за любые решения или советы по поиску причины,
Стейн