使用当前时间条件处理单元测试

Sha*_* D. 15 java tdd junit unit-testing mocking

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

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

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 );
}
Run Code Online (Sandbox Code Playgroud)

所以,我不知道该怎么做,因为'new Date()'不是一个静态的标准.

  1. 我不应该费心去测试'isValid',只是分别测试'isLicenseStringValid()'和'getExpiryDate()'函数吗?
  2. 我是否只是在测试中使用许可证密钥,并且到期时间很长,这样我就可以在到期时切换作业了?
  3. 我是否试图将'new Date()'模拟为某些'getCurrentTime()'方法,以便我可以假装它现在是什么时候?

其他人通常会做什么时间条件的测试?

Jon*_*eet 24

绝对嘲笑new Date().

Clock使用getCurrentTime()方法或类似方法创建接口.这样你就可以FakeClock进行测试SystemClock,使用System.currentTimeMillis()什么或者其他什么.

我已经多次这样做了 - 它运作得非常好.这也是合乎逻辑的 - 实际上你需要一个"当前时间服务",因此应该像任何其他依赖项一样注入.


Mik*_*ton 5

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