处理具有当前时间条件的单元测试

2022-09-03 04:17:07

我正在尝试为我正在处理的项目中的某些实用程序类设置单元测试,其中一个类(包含许可信息)有一个方法,可以根据当前时间进行一些确定。

即许可证包含到期日期,许可证字符串验证该日期,但查看许可证是否过期的实际逻辑基于当前时间。

public boolean isValid()
{
    return isLicenseStringValid() && !isExpired();
}

public boolean isExpired()
{
    Date expiry = getExpiryDate();
    if( expiry == null ) {
        return false;
    }

    Date now = new Date();

    return now.after( expiry );
}

所以,我不知道该怎么办,因为“new Date()”不是一个静态标准。

  1. 我是否应该费心去测试'isValid',而只是分别测试'isLicenseStringValid()'和'getExpiryDate()'函数?
  2. 我是否只是在测试中使用许可证密钥,并且过期时间很长,这样我就会在过期时切换作业?
  3. 我是否尝试将“new Date()”模拟为某些“getCurrentTime()”方法,以便我可以伪造现在的时间?

其他人通常如何处理时间条件的测试?


答案 1

绝对嘲笑。new Date()

使用方法或类似内容创建接口。这样,您就可以有一个用于测试和一个使用或任何东西。ClockgetCurrentTime()FakeClockSystemClockSystem.currentTimeMillis()

我已经做过很多次了 - 它工作得非常好。这也是合乎逻辑的 - 实际上你需要一个“当前时间服务”,所以应该像任何其他依赖项一样注入。


答案 2

我通常将日期提供程序注入到测试的代码中。如果您需要切换约定或以其他方式“修复”时间测试代码,这也会有所帮助。


推荐