web-dev-qa-db-fra.com

Définition du fuseau horaire pour les tests unitaires maven sur Java 8

Comment définir le fuseau horaire pour les tests unitaires dans maven surefire sur Java 8?

Avec Java 7, cela fonctionnait avec systemPropertyVariables comme dans la configuration suivante, mais avec Java 8 les tests utilisent simplement le fuseau horaire du système).

<plugin>
  <groupId>org.Apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <configuration>
    <systemPropertyVariables>
      <user.timezone>UTC</user.timezone>
    </systemPropertyVariables>

Pourquoi est-ce et comment le résoudre?

24

Réponse courte

Java lit maintenant user.timezone Plus tôt, avant que surefire ne définisse les propriétés dans systemPropertyVariables. La solution consiste à le définir plus tôt, en utilisant argLine:

<plugin>
  ...
  <configuration>
    <argLine>-Duser.timezone=UTC</argLine>

Longue réponse

Java initialise le fuseau horaire par défaut, en tenant compte de user.timezone Le premier moment où il en a besoin, puis le met en cache dans Java.util.TimeZone . Cela se produit maintenant déjà lors de la lecture d'un fichier jar: ZipFile.getZipEntry Appelle maintenant ZipUtils.dosToJavaTime Qui crée une instance Date qui initialise le fuseau horaire par défaut. Ce n'est pas un problème spécifique infaillible. Certains l'appellent un bug dans JDK7. Ce programme utilisé pour imprimer l'heure en UTC, mais utilise maintenant le fuseau horaire du système:

import Java.util.*;

class TimeZoneTest {
  public static void main(String[] args) {
    System.setProperty("user.timezone", "UTC");
    System.out.println(new Date());
  }
}

En général, la solution consiste à spécifier le fuseau horaire sur la ligne de commande, comme Java -Duser.timezone=UTC TimeZoneTest, Ou à le définir par programme avec TimeZone.setDefault(TimeZone.getTimeZone("UTC"));.

Full'ish exemple :

  <build>
    <plugins>
      <plugin>
        <groupId>org.Apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        ... could specify version, other settings if desired ...
        <configuration>
          <argLine>-Duser.timezone=UTC</argLine>
        </configuration>
      </plugin>
    </plugins>
  </build>
51