как написать тестовый пример junit для недавнего перехода на форвард в Канаде на 2020 годa tz - PullRequest
1 голос
/ 05 мая 2020

Я хочу знать, как написать тестовый пример JUnit для весеннего перехода forwrd в Канаде. см. информацию ниже не отступать от 2020-11-01

см. эту ссылку https://www.iana.org/time-zones

Мне нужен код в Java 7, и мне нужно написать в Джода-Тайм.

Ответы [ 2 ]

0 голосов
/ 08 мая 2020

@ ole, что утверждение assert не является обобщаемым утверждением. я думаю, что мы могли бы сделать этот расчет 1 ноября и накануне. Моя идея в том, что если мы вычтем значение из другого, мы получим -1,0, + 1. так что мы можем обнаружить пружину вперед, нормальный день и назад. Главное, писать нужно в йода-тайм. Это ниже код, который не правильный. потому что getoffset не получается при написании кода.

    DateTimeZone timezone = DateTimeZone.forID("America/Whitehorse");
    DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss").withZone(timezone);
    DateTime dateTimeStart = formatter.parseDateTime("2020-11-1T01:00:00");
    dateTimeStart.withZone(timezone).withLaterOffsetAtOverlap();
    DateTime dateTimeStop = formatter.parseDateTime("2020-10-31T01:00:00");
    dateTimeStop.withZone(timezone).withLaterOffsetAtOverlap();
    assertEquals((dateTimeStart.getMillis() / 10000), (dateTimeStop.getMillis() / 10000));
0 голосов
/ 05 мая 2020

java .time

Я рекомендую вам использовать java .time, современный Java API даты и времени, для работы с датой и временем.

@Test
void doesNotFallBackToMinus8InNovember2020() {
    ZoneId whitehorse = ZoneId.of("America/Whitehorse");
    ZoneOffset offsetAtAbsentTransition
            = LocalDateTime.of(2020, Month.NOVEMBER, 1, 1, 0)
                    .atZone(whitehorse)
                    .withLaterOffsetAtOverlap()
                    .getOffset();
    assertEquals(ZoneOffset.ofHours(-7), offsetAtAbsentTransition);
}

То же самое для America / Dawson.

На моем JUnit 5 тест не проходит:

org.opentest4j.AssertionFailedError: expected: <-07:00> but was: <-08:00>
  at org.junit.jupiter.api.AssertionUtils.fail(AssertionUtils.java:55)
  at org.junit.jupiter.api.AssertEquals.failNotEqual(AssertEquals.java:195)
  at org.junit.jupiter.api.AssertEquals.assertEquals(AssertEquals.java:184)
  at org.junit.jupiter.api.AssertEquals.assertEquals(AssertEquals.java:179)
  at org.junit.jupiter.api.Assertions.assertEquals(Assertions.java:1124)
(many more lines)

Это потому, что у меня нет последнего обновления в базу данных часовых поясов.

Мой Java ошибочно «думает», что часы переведены с 2 утра на 1 ночи 1 ноября. Это ошибка, которую вы хотите, чтобы тест обнаружил. Таким образом, настенные часы будут показывать 01:00 дважды, один раз со смещением -07: 00 (правильно) и один раз со смещением -08: 00 (неправильно). Чтобы поймать не тот, нужно использовать withLaterOffsetAtOverlap(). При обновленной установке Java этот вызов не будет иметь никакого значения, потому что не будет никакого перекрытия.

Изменить: вы, конечно, также можете выбрать дату в середине зимы, а не точное время когда переход не должен произойти. Я бы, наверное, сделал и то, и другое, на всякий случай.

Edit 2:

Мне нужен приведенный выше код в java 7. как мы можем написать то же самое в java 7

Вы используете ThreeTen Backport, этот бэкпорт java .time, современного Java API даты и времени, для Java 6 и 7. Затем вы просто используете точно такой же код. . Смотрите ссылки внизу для backport. Вам не нужно обновлять производственный код до java .time (даже если это будет иметь преимущества), чтобы использовать java .time в (одном из) ваших модульных тестов.

Как вы сказали, после обновления до базы данных нового часового пояса оператор assert работает ??

Должен. Я не пробовал себя, но это была идея.

Вопрос: Как использовать бэкпорт java .time с Java 7?

java .time just требуется как минимум Java 6 .

  • В Java 8 и более поздних версиях и на более новых устройствах Android (начиная с уровня API 26) современный API встроен .
  • В не- Android Java 6 и 7 получите ThreeTen Backport, бэкпорт современных классов (ThreeTen для JSR 310; см. Ссылки внизу).
  • На (более ранней) Android используйте Android версию ThreeTen Backport. Это называется ThreeTenABP. И убедитесь, что вы импортируете классы даты и времени из org.threeten.bp с подпакетами.

Редактировать 3: Joda-Time

Я хочу использовать время joda вместо java .time, но я изо всех сил пытаюсь получить getoffset, как вы написали в коде. Не могли бы вы сказать мне, что тот же код в joda time

Я действительно не вижу веских причин, почему вы должны использовать Joda-Time для этого, когда вы можете использовать ThreeTen Backport и, следовательно, java. time, преемник Joda-Time. На домашней странице Joda-Time:

Обратите внимание, что с Java SE 8 и далее пользователям предлагается перейти на java.time (JSR-310) - основную часть JDK, которая заменяет этот проект.

Я знаю, что вы используете Java 7; но если вы добавляете к своим тестам внешнюю зависимость, почему бы не добавить самую лучшую и самую современную из возможных?

В любом случае, вот эквивалентный тест JUnit 4 для Joda-Time:

@Test
public void test() {
    DateTimeZone timezone = DateTimeZone.forID("America/Whitehorse");
    Instant dt = new DateTime(2020, 11, 1, 1, 0, timezone)
            .withLaterOffsetAtOverlap()
            .toInstant();
    long offsetInMilliseconds = timezone.getOffset(dt.getMillis());
    assertEquals(TimeUnit.HOURS.toMillis(-7), offsetInMilliseconds);
}

Опять же, в Joda-Time 2.9.9 и Java 7 происходит сбой:

java.lang.AssertionError: expected:<-25200000> but was:<-28800000>
  at org.junit.Assert.fail(Assert.java:88)
  at org.junit.Assert.failNotEquals(Assert.java:834)
(etc.)

Вы заметили, что сообщение об ошибке включает в себя несколько более сложные значения миллисекунд. чтобы прочитать смещения, указанные в сообщении об ошибке из теста java .time выше.

Я не эксперт Joda-Time, но, если я правильно понял, Joda-Time хранит свою собственную копию база данных часовых поясов. Таким образом, обновление вашей Java установки - не лучший способ пройти тест. Вместо этого вам нужно обновить Joda-Time. Инструкции находятся на веб-сайте Joda-Time, см. Ссылку внизу.

Ссылки

...