JUnit与不确定性的日期时间比较

时间:2015-09-05 06:18:21

标签: java datetime junit junit4

检查double值时,为比较函数提供精度(delta)是正常的,例如asserEquals()

如何对日期时间值执行相同操作?假设我不希望与微秒精度进行比较,但希望检查一些不准确的时间。

如何做到这一点?

4 个答案:

答案 0 :(得分:4)

就个人而言,我会为它写一个简单的Hamcrest风格的Matcher ......

class CloseToDate extends BaseMatcher<Date> {

    private Date closeTo;
    private long deltaInMs;

    public CloseToDate(Date closeTo, long deltaInMs) {
        this.closeTo = closeTo;
        this.deltaInMs = deltaInMs;
    }

    @Override
    public boolean matches(Object arg0) {

        if (!(arg0 instanceof Date)) {
            return false;
        }

        Date date = (Date)arg0;

        return Math.abs( date.getTime() - closeTo.getTime()) <= deltaInMs;
    }

    @Override
    public void describeTo(Description arg0) {
        arg0.appendText(String.format("Not more than %s ms from %s", deltaInMs, closeTo));
    }

    public static CloseToDate closeToDate(Date date, long deltaInMs) {
        return new CloseToDate(date, deltaInMs);
    }
}

这样你可以使用静态导入来简单地写...

assertThat( myDate, closeToDate( someDate, 1000 ) ); // for 1000ms tolerance

...如果你问我,那就很好看了。

答案 1 :(得分:4)

如果您有日期,则可以使用内置错误。

assertEquals(date1.getTime(), date2.getTime(), 1);

如果您有LocalDateTime,则可以比较截断的时间。

assertEquals(ldt1.truncatedTo(ChronoUnit.MILLI_SECONDS),
             ldt2.truncatedTo(ChronoUnit.MILLI_SECONDS));

答案 2 :(得分:1)

您可以使用相同的格式(无论您想要的精度)转换为String,并比较两个字符串。

答案 3 :(得分:0)

您可以使用https://github.com/eXparity/hamcrest-date#usage

LocalDateTime myAppointment = LocalDateTime.of(2015, AUGUST, 9, 10, 30, 0);
assertThat(LocalDateTime.now(), within(15, MINUTES, myAppointment));