【问题标题】:How to test and compare two java.time.format.DateTimeFormatter-s?如何测试和比较两个 java.time.format.DateTimeFormatter-s?
【发布时间】:2020-09-14 15:43:49
【问题描述】:

如何比较两个 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

从类 java.lang.Object 继承的方法 clone、equals、finalize、getClass、hashCode、notify、notifyAll、等待、等待、等待

需要时用例:

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

例如:

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

【问题讨论】:

  • "我想创建一个测试来验证返回的 DateFormatter 是否正确" 然后测试它的行为,而不是身份:确保它以你期望的方式格式化日期。
  • 我怀疑对 DateTimeFormatter 的代码有影响或有影响的人会出现在这里并回答您的问题。除此之外,这个问题只能作为意见的非法答案,而不是事实。因此,我认为这个问题不适合 Stack Overflow,因为我们尽量避免将意见作为答案的问题。
  • 我有固定的标题和问题。@Rono @Steve

标签: java core


【解决方案1】:

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

JDK 开发人员的时间是有限的。他们优先考虑进口的东西。 DateTimeFormatter 以一致且惯用的方式覆盖 equals 比看起来要困难得多,最好把时间花在其他地方。

无论如何,它无法帮助您了解它为什么不存在。这就是你所处的情况,而且不会很快改变。

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

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

【讨论】:

    【解决方案2】:

    ways to obtain the original pattern比较。

    由于DateTimeFormatter 是一个无法扩展的final 类,您可以将所有实例替换为在构造函数中创建DateTimeFormatter 实例并访问生成的DateTimeFormatter 实例的包装类并在您的代码中传递您的自定义 DataTimeFormatterContainer 类。它是一头野兽,但它会按照你的要求去做。

    当然,这完全是比较模式;如果两个不同的模式在解析日期时产生相同的结果,这将返回 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);
        }
    }
    

    【讨论】:

    • 一般来说,如果您发现自己引入复杂性纯粹是为了测试,您应该重新考虑。如果格式需要偏离模式可以支持的内容,那么您的实现就会变得不必要地受到限制——构建器可以做的比模式做的要多。
    • 正如我所说,它是一头野兽,但它会按照他的要求去做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多