Java Date:getDisplayName方法仅在CI上向dayOfWeek添加点字符
在CircleCI上运行的我的UnitTest中调用Java Date:getDisplayName方法仅在CI上向dayOfWeek添加点字符,java,android,formatting,localdate,threetenbp,Java,Android,Formatting,Localdate,Threetenbp,在CircleCI上运行的我的UnitTest中调用localDate.getDayOfWeek().getDisplayName,与在本地运行UnitTest相比,返回的值不同 以下是简化的示例代码: LocalDate localDate = LocalDate.of(2019, 12, 20); String dayOfWeek = localDate.getDayOfWeek().getDisplayName(TextStyle.SHORT, Locale.GERMANY); asse
localDate.getDayOfWeek().getDisplayName
,与在本地运行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[]>
..
junit.framework.ComparisonFailure:应为:但为:
..
提示:我正在使用
更新
如@OleV.V.和@Arvind Kumar Avinash所述,不同行为(本地和CI)的原因是JDK版本(本地8.x和CI 11.x)的差异
这就留下了我的一部分问题:“如何正确地解决这个问题?”
这是在我的CI docker映像上更改JDK版本的正确/唯一方法?更新:
查看更新后的问题后,问题似乎是因为运行CircleCI的机器上缺少的库。如果没有这个库,当代码在这台机器上重新编译时,它可能默认为java.time
。您应该检查这台机器上的一些东西:
TextStyle.SHORT\u STANDALONE
输出:
Fr
Fr
Fr
Fr
Fr.
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
Fr
Fr
Fr.
Fr
注意:TextStyle.SHORT的结果会随着java.time
API的变化而变化,如下所示:
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
Fr
Fr.
Fr
goemic-有什么更新吗?这能回答你的问题吗?ThreeTenABP在CircleCI上运行吗?只是好奇。我很确定这种错误行为与不同的java版本(本地和CI)有关,但这并不能回答我关于如何正确修复iTunes的问题。SHORT_STANDALONE并不能解决这个问题。我仍然在CI上得到错误:
junit.framework.ComparisonFailure:expected:但是:
@goemic-查看错误消息,assertEquals(“Fr.”,dayOfWeek)
将通过,但您会说,…在CircleCI上运行与在本地运行UnitTest相比返回不同的值。
这是令人惊讶的。迁移到java.time
不是一个选项(现在),因为我们仍然面临r8去糖化的一些问题。替换这些点的是我已经在做的“黑客”修复,但我正在寻找一个真正的修复,以使代码再次干净-并避免项目中出现太多黑客;)这确实令人惊讶,这就是我发布这个问题的原因:D我认为它与CI的docker图像中使用的jdk版本有某种关联。@goemic-Co顺便说一句,在你发布此评论的同时,我也在更新答案:)。问题解决后,我将等待您的更新。即使我的答案不适合你,我建议你发布自己的工作解决方案,这将有助于未来的访问者。