如何使用PowerMockito模拟Java日历

问题描述

我想模拟以下方法,以使用powermockito返回true。

private boolean isResetPswrdLinkExpired(Timestamp timestamp) {

        Calendar then = Calendar.getInstance();
        then.setTime(timestamp);
        then.getTime();
        Calendar Now = Calendar.getInstance();
        Long diff = Now.getTimeInMillis() - then.getTimeInMillis();
        if (diff < 24 * 60 * 60 * 1000) {
            return false;
        } else {
            return true;
        }
    }

解决方法

请勿使用Calendar,而应使用java.time(总是,不仅限于此;请参见该方法的可读性)。使用java.time,您可以使用Clock进行测试。

class PasswordManager

    @Setter
    private Clock clock = Clock.systemUTC();

    private boolean isExpired(Instant timestamp) {
        return timestamp.plus(1,DAYS).isBefore(Instant.now(clock));
    }

然后在您的测试用例中,

passwordManager.setClock(Clock.fixed(...));

(注意:也请避免使用if(...) { return true } else { return false}或反之。相反,请按照我的指示进行操作,然后直接return !(diff < ...)。)