ホームページ > Java > &#&チュートリアル > DateTimeFormatterBuilder 単体テストは失敗するのに、ランタイムは同じ入力文字列で動作するのはなぜですか?

DateTimeFormatterBuilder 単体テストは失敗するのに、ランタイムは同じ入力文字列で動作するのはなぜですか?

Susan Sarandon
リリース: 2024-11-28 13:35:12
オリジナル
248 人が閲覧しました

Why Does My DateTimeFormatterBuilder Unit Test Fail, But Runtime Works with the Same Input String?

DateTimeFormatterBuilder がテスト環境で失敗する

問題:

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]);
}
ログイン後にコピー

調査:

  • 実行時、アプリケーションは指定された文字列を解析するときに正しく動作します。
  • テスト時、同じ文字列は失敗します。 parse.

解決策:

この問題は、文字列内の月名の解析に JVM のデフォルト ロケールを使用するために発生します。これを解決するには、フォーマッタの作成時に Locale.ENGLISH ロケールを指定します。

DateTimeFormatter DATE_TIME_FORMAT = new DateTimeFormatterBuilder()
    .parseCaseInsensitive()
    .appendPattern("dd-MMM-yyyy HH:mm")
    .toFormatter(Locale.ENGLISH);
ログイン後にコピー

ロケールを明示的に設定することにより、フォーマッタは JVM のデフォルト ロケールに関係なく一貫した解析を保証し、テスト環境での問題を解決します。

以上がDateTimeFormatterBuilder 単体テストは失敗するのに、ランタイムは同じ入力文字列で動作するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート