如何测试和比较两个java.time.format.DateTimeFormatter-s?

问题描述

如何比较两个java.time.format.DateTimeFormatters?

由于DateTimeFormatters没有重写的“等于”方法

测试:

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

从类java.lang.Object继承的方法 克隆,等于,完成,getClass,hashCode,通知,notifyAll,等待,等待,等待

需要时的用例:

例如,我的方法返回DateTimeFormatter。我想创建测试以验证返回的DateFormatter是否正确。

例如:

DateTimeFormatter expectedFormatter = DateTimeFormatter.ofPattern("my custom format")
DateTimeFormatter actualFormatter = someService.getFormatter()
Assert.assertEquals(actualFormatter,expectedFormatter)

解决方法

可能是因为确定格式化程序的相等性并非易事,因为有许多方法可以通过构建器构造“相同”格式化程序(就行为而言),并且很少有用。

JDK开发人员有有限的时间。他们优先考虑进口物品。以一致且惯用的方式覆盖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比看起来要困难得多,因为最好在其他地方花费时间。

无论如何,它不能帮助您知道为什么不存在。这就是您所处的情况,并且不会很快改变。

我的建议是测试行为。构造一些日期(或日期时间),看看两个格式化程序是否产生相同的输出。

{{1}}
,

ways to obtain the original pattern供比较。

由于DateTimeFormatter是无法扩展的final类,因此可以用包装器类替换所有实例,该包装器类在构造函数中创建DateTimeFormatter的实例并访问生成的DateTimeFormatter实例,并在代码中传递自定义的DataTimeFormatterContainer类。这是野兽,但会满足您的要求。

当然,这正好比较了模式;如果两个不同的模式在解析日期时产生相同的结果,则将返回false。

有关骨骼的建议;没有空检查,访问器方法或哈希码:

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);
    }
}