0

与在本地运行 UnitTest 相比,调用localDate.getDayOfWeek().getDisplayName在 CircleCI 上运行的 UnitTest 返回不同的值。

这是简化的示例代码:

LocalDate localDate = LocalDate.of(2019, 12, 20);
String dayOfWeek = localDate.getDayOfWeek().getDisplayName(TextStyle.SHORT, Locale.GERMANY);

assertEquals("Fr", dayOfWeek); // actual = "Fr."

dayOfWeek包含一个“。” 仅在 CI 上,但我不明白为什么以及如何(正确地)修复它。

这是 UnitTest 的错误日志:

junit.framework.ComparisonFailure: expected:<Fr[.]> but was:<Fr[]>
..

提示:我正在使用ThreeTen Android Backport

更新 正如@OleV.V.和@Arvind Kumar Avinash 所提到的,不同行为(本地和CI)的原因是JDK版本(本地8.x和CI 11.x)的差异。

这让我的部分问题悬而未决:“如何正确解决这个问题?” 这是在我的 CI docker 映像上更改 JDK 版本的正确/唯一方法?

4

1 回答 1

1

更新:

在查看更新后的问题后,问题似乎是因为在运行 CircleCI 的机器上缺少ThreeTen Android Backport库。在没有这个库的情况下,可能默认java.time是在这台机器上重新编译代码的时候。你应该在这台机器上检查一些东西:

  1. 如果库已成功导入。
  2. 如果缺少某些类型,是否有任何设置可以自动导入最合适的类型。
  3. 如果JDK版本与本地机器相同。

原答案:

您可以使用TextStyle.SHORT_STANDALONE

import java.util.Locale;

import org.threeten.bp.LocalDate;
import org.threeten.bp.format.TextStyle;

class Main {
    public static void main(String[] args) {
        LocalDate localDate = LocalDate.of(2019, 12, 20);
        String dayOfWeek = localDate.getDayOfWeek().getDisplayName(TextStyle.SHORT_STANDALONE, Locale.GERMAN);
        System.out.println(dayOfWeek);
    }
}

输出:

Fr

TextStyle.SHORT不过,我的系统上的输出中没有一个点。尽管如此,如果您仍然想使用TextStyle.SHORT并且没有点(或任何标点符号),您可以用空白字符串替换每个标点符号。

import java.util.Locale;

import org.threeten.bp.LocalDate;
import org.threeten.bp.format.TextStyle;

class Main {
    public static void main(String[] args) {
        LocalDate localDate = LocalDate.of(2019, 12, 20);
        String dayOfWeek = localDate.getDayOfWeek().getDisplayName(TextStyle.SHORT, Locale.GERMANY);
        System.out.println(dayOfWeek);

        // Remove all punctuation mark
        dayOfWeek = dayOfWeek.replaceAll("\\p{Punct}", "");
        System.out.println(dayOfWeek);
    }
}

输出:

Fr
Fr

注意:TextStyle.SHORT使用 API 更改的结果java.time如下所示:

import java.time.LocalDate;
import java.time.format.TextStyle;
import java.util.Locale;

class Main {
    public static void main(String[] args) {
        LocalDate localDate = LocalDate.of(2019, 12, 20);

        String dayOfWeek = localDate.getDayOfWeek().getDisplayName(TextStyle.SHORT_STANDALONE, Locale.GERMANY);
        System.out.println(dayOfWeek);

        dayOfWeek = localDate.getDayOfWeek().getDisplayName(TextStyle.SHORT, Locale.GERMANY);
        System.out.println(dayOfWeek);

        // Remove all punctuation mark
        dayOfWeek = dayOfWeek.replaceAll("\\p{Punct}", "");
        System.out.println(dayOfWeek);
    }
}

输出:

Fr
Fr.
Fr
于 2020-12-09T16:16:00.360 回答