web-dev-qa-db-ja.com

Java 8でのMavenユニットテストのタイムゾーンの設定

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>

それはなぜですか、どうすれば修正できますか?

24

簡潔な答え

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>
_
51