問題:
DateTimeFormatterBuilder の単体テストが、動作する同じ入力文字列で失敗する実行時。テスト対象の文字列値は「25-May-2018 11:10」です。
テスト対象メソッド:
public void getTimeDifference(@RequestParam String startDate, @RequestParam String endDate) { DateTimeFormatter DATE_TIME_FORMAT = new DateTimeFormatterBuilder().parseCaseInsensitive().appendPattern("dd-MMM-yyyy HH:mm").toFormatter(); LocalDateTime.parse(startDate,DATE_TIME_FORMAT); return messages; }
テストメソッド:
@Test public void testFormat() throws Exception { final String startDateFormatA = "25-May-2018 11:10"; final String endDateFormatA = "25-May-2018 11:10"; assertEquals("06:00", callDbController.getTimeDifference(startDateFormatA, endDateFormatA)[1]); }
調査:
解決策:
この問題は、文字列内の月名の解析に JVM のデフォルト ロケールを使用するために発生します。これを解決するには、フォーマッタの作成時に Locale.ENGLISH ロケールを指定します。
DateTimeFormatter DATE_TIME_FORMAT = new DateTimeFormatterBuilder() .parseCaseInsensitive() .appendPattern("dd-MMM-yyyy HH:mm") .toFormatter(Locale.ENGLISH);
ロケールを明示的に設定することにより、フォーマッタは JVM のデフォルト ロケールに関係なく一貫した解析を保証し、テスト環境での問題を解決します。
以上がDateTimeFormatterBuilder 単体テストは失敗するのに、ランタイムは同じ入力文字列で動作するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。