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?
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>
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>