如何测试和比较两个 java.time.format.DateTimeFormatter-s?
How to test and compare two java.time.format.DateTimeFormatter-s?
如何比较两个java.time.format.DateTimeFormatters?
由于 DateTimeFormatters 没有重写的 'equals' 方法。
测试:
import java.time.format.DateTimeFormatter;
DateTimeFormatter.ofPattern("M/dd/yyyy").equals(DateTimeFormatter.ofPattern("M/dd/yyyy"))
结果:
false
这是'Object.equals()'方法的行为。
文档:https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
需要时的用例:
例如我的方法returns DateTimeFormatter。我想创建测试来验证返回的 DateFormatter 是否正确。
例如:
DateTimeFormatter expectedFormatter = DateTimeFormatter.ofPattern("my custom format")
DateTimeFormatter actualFormatter = someService.getFormatter()
Assert.assertEquals(actualFormatter, expectedFormatter)
可能是因为确定格式化程序的相等性是 non-trivial,因为有很多方法可以通过构建器构建“相同”的格式化程序(就行为而言),而且很少有用。
JDK 开发人员的时间有限。他们优先考虑进口的东西。 DateTimeFormatter 以一致且惯用的方式覆盖 equals
比看起来要难得多,他们最好把时间花在其他地方。
无论如何,知道它为什么不存在对你没有帮助。这就是你所处的情况,而且不会很快改变。
我的建议是测试行为。构造一些日期(或 date-time)并查看两个格式化程序是否产生相同的输出。
DateTimeFormatter expectedFormatter = DateTimeFormatter.ofPattern("my custom format")
DateTimeFormatter actualFormatter = someService.getFormatter();
LocalDate someFakeDate = LocalDate.of(2020, 1, 1);
Assert.assertEquals(actualFormatter.format(someFakeDate), expectedFormatter.format(someFakeDate));
有个可以比较
由于 DateTimeFormatter
是无法扩展的 final
class,您可以将所有实例替换为创建 class 实例的包装器 class =11=] 在构造函数中访问生成的 DateTimeFormatter
实例并在代码中传递自定义 DataTimeFormatterContainer
classes。它是一头野兽,但它会按照你的要求去做。
当然,这个比较完全符合规律;如果两个 non-identical 模式在解析日期时生成相同的结果,这将 return false。
准系统提案;没有 null 检查、访问器方法或哈希码:
public class DateTimeFormatterContainer() {
public final String pattern;
public final DateTimeFormatter formatter;
public DateTimeFormatterContainer(String pattern) {
this.pattern = pattern;
this.formatter = DateTimeFormatter.ofPattern(pattern);
}
public boolean equals(DateTimeFormatterContainer that) {
return this.pattern.equals(that.pattern);
}
}
如何比较两个java.time.format.DateTimeFormatters?
由于 DateTimeFormatters 没有重写的 'equals' 方法。
测试:
import java.time.format.DateTimeFormatter;
DateTimeFormatter.ofPattern("M/dd/yyyy").equals(DateTimeFormatter.ofPattern("M/dd/yyyy"))
结果:
false
这是'Object.equals()'方法的行为。 文档:https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html
Methods inherited from class java.lang.Object clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
需要时的用例:
例如我的方法returns DateTimeFormatter。我想创建测试来验证返回的 DateFormatter 是否正确。
例如:
DateTimeFormatter expectedFormatter = DateTimeFormatter.ofPattern("my custom format")
DateTimeFormatter actualFormatter = someService.getFormatter()
Assert.assertEquals(actualFormatter, expectedFormatter)
可能是因为确定格式化程序的相等性是 non-trivial,因为有很多方法可以通过构建器构建“相同”的格式化程序(就行为而言),而且很少有用。
JDK 开发人员的时间有限。他们优先考虑进口的东西。 DateTimeFormatter 以一致且惯用的方式覆盖 equals
比看起来要难得多,他们最好把时间花在其他地方。
无论如何,知道它为什么不存在对你没有帮助。这就是你所处的情况,而且不会很快改变。
我的建议是测试行为。构造一些日期(或 date-time)并查看两个格式化程序是否产生相同的输出。
DateTimeFormatter expectedFormatter = DateTimeFormatter.ofPattern("my custom format")
DateTimeFormatter actualFormatter = someService.getFormatter();
LocalDate someFakeDate = LocalDate.of(2020, 1, 1);
Assert.assertEquals(actualFormatter.format(someFakeDate), expectedFormatter.format(someFakeDate));
有
由于 DateTimeFormatter
是无法扩展的 final
class,您可以将所有实例替换为创建 class 实例的包装器 class =11=] 在构造函数中访问生成的 DateTimeFormatter
实例并在代码中传递自定义 DataTimeFormatterContainer
classes。它是一头野兽,但它会按照你的要求去做。
当然,这个比较完全符合规律;如果两个 non-identical 模式在解析日期时生成相同的结果,这将 return false。
准系统提案;没有 null 检查、访问器方法或哈希码:
public class DateTimeFormatterContainer() {
public final String pattern;
public final DateTimeFormatter formatter;
public DateTimeFormatterContainer(String pattern) {
this.pattern = pattern;
this.formatter = DateTimeFormatter.ofPattern(pattern);
}
public boolean equals(DateTimeFormatterContainer that) {
return this.pattern.equals(that.pattern);
}
}