Java 8のmaven surefireでユニットテストのタイムゾーンを設定するにはどうすればよいですか?
Java 7の場合、これは以前はsystemPropertyVariables
で次の構成のように機能していましたが、Java 8の場合、テストはシステムのタイムゾーンを使用します。
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<systemPropertyVariables>
<user.timezone>UTC</user.timezone>
</systemPropertyVariables>
それはなぜですか、どうすれば修正できますか?
Javaは、確実に_systemPropertyVariables
にプロパティを設定する前に、以前に_user.timezone
_を読み取ります。解決策は、argLine
を使用して、以前に設定することです。
_<plugin>
...
<configuration>
<argLine>-Duser.timezone=UTC</argLine>
_
Javaは、デフォルトのタイムゾーンを初期化し、_user.timezone
_を必要なfirst時間を考慮に入れて、それを_Java.util.TimeZone
_にキャッシュします。これは、jarファイルを読み取るときにすでに行われています。_ZipFile.getZipEntry
_が_ZipUtils.dosToJavaTime
_を呼び出し、デフォルトのタイムゾーンを初期化するDate
インスタンスを作成します。これは確実な問題ではありません。 JDK7では bug と呼ぶ人もいます。このプログラムは、以前はUTCで時刻を出力していましたが、現在はシステムのタイムゾーンを使用しています。
_import Java.util.*;
class TimeZoneTest {
public static void main(String[] args) {
System.setProperty("user.timezone", "UTC");
System.out.println(new Date());
}
}
_
一般に、解決策は、_Java -Duser.timezone=UTC TimeZoneTest
_のようにコマンドラインでタイムゾーンを指定するか、TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
を使用してプログラムで設定することです。
完全な 例 :
_ <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>
_