我刚刚遇到了一个类似的问题,我创建了一个界面来抽象这个:Sleeper
public interface Sleeper
{
void sleep( long millis ) throws InterruptedException;
}
默认实现使用:Thread.sleep()
public class ThreadSleeper implements Sleeper
{
@Override
public void sleep( long millis ) throws InterruptedException
{
Thread.sleep( millis );
}
}
在我的单元测试中,我注入了一个:FixedDateTimeAdvanceSleeper
public class FixedDateTimeAdvanceSleeper implements Sleeper
{
@Override
public void sleep( long millis ) throws InterruptedException
{
DateTimeUtils.setCurrentMillisFixed( DateTime.now().getMillis() + millis );
}
}
这允许我在单元测试中查询时间:
assertThat( new DateTime( DateTimeUtils.currentTimeMillis() ) ).isEqualTo( new DateTime( "2014-03-27T00:00:30" ) );
请注意,您需要在测试开始时修复首次使用的时间,并在测试后再次恢复使用的时间DateTimeUtils.setCurrentMillisFixed( new DateTime( "2014-03-26T09:37:13" ).getMillis() );
DateTimeUtils.setCurrentMillisSystem();