Ответ 1
Вы можете использовать @Rule
для этого. Вот код для правила:
import org.joda.time.DateTimeZone;
import org.junit.rules.TestWatcher;
import org.junit.runner.Description;
public class UTCRule extends TestWatcher {
private DateTimeZone origDefault = DateTimeZone.getDefault();
@Override
protected void starting( Description description ) {
DateTimeZone.setDefault( DateTimeZone.UTC );
}
@Override
protected void finished( Description description ) {
DateTimeZone.setDefault( origDefault );
}
}
Вы можете использовать правило следующим образом:
public class SomeTest {
@Rule
public UTCRule utcRule = new UTCRule();
....
}
Это изменит текущий часовой пояс на UTC перед выполнением каждого теста в SomeTest
и восстановит часовой пояс по умолчанию после каждого теста.
Если вы хотите проверить несколько часовых поясов, используйте такое правило:
import org.joda.time.DateTimeZone;
import org.junit.rules.TestWatcher;
import org.junit.runner.Description;
public class TZRule extends TestWatcher {
private DateTimeZone origDefault = DateTimeZone.getDefault();
private DateTimeZone tz;
public TZRule( DateTimeZone tz ) {
this.tz = tz;
}
@Override
protected void starting( Description description ) {
DateTimeZone.setDefault( tz );
}
@Override
protected void finished( Description description ) {
DateTimeZone.setDefault( origDefault );
}
}
Поместите все затронутые тесты в абстрактный базовый класс AbstractTZTest
и расширьте его:
public class UTCTest extends AbstractTZTest {
@Rule public TZRule tzRule = new TZRule( DateTimeZone.UTC );
}
Это выполнит все тесты в AbstractTZTest
с UTC. Для каждого часового пояса, который вы хотите проверить, вам понадобится другой класс:
public class UTCTest extends AbstractTZTest {
@Rule public TZRule tzRule = new TZRule( DateTimeZone.forID( "..." );
}
Поскольку тестовые случаи наследуются, это все - вам просто нужно определить правило.
Аналогичным образом вы можете сдвинуть системные часы. Используйте правило, которое вызывает DateTimeUtils.setCurrentMillisProvider(...)
чтобы имитировать выполнение теста в определенное время, и DateTimeUtils.setCurrentMillisSystem()
чтобы восстановить значения по умолчанию.
Примечание. Вашему провайдеру понадобится сделать отметку часов, иначе все новые экземпляры DateTime
будут иметь одинаковое значение. Я часто getMillis()
значение на миллисекунду каждый раз, когда getMillis()
.
Примечание 2: Это работает только с Joda-Time. Это не влияет на new java.util.Date()
.
Примечание 3: Вы больше не можете запускать эти тесты параллельно. Они должны выполняться последовательно, или один из них, скорее всего, восстановит часовой пояс по умолчанию во время выполнения другого теста.