使用 Thread.sleep 进行测试

2022-09-04 07:10:07

使用哪些推荐方法来加快测试速度。Thread.sleep()

我正在测试一个具有重试功能的网络库,当连接断开或发生超时错误等。但是,该库在重试之间使用 a(因此在服务器重新启动时它不会连接数千次)。该调用大大减慢了单元测试的速度,我想知道有哪些选项可以覆盖它。Thread.sleep()

请注意,我愿意实际更改代码,或者使用模拟框架来模拟Thread.sleep(),但希望先听取您的意见/建议。


答案 1

通常,将与时间相关的功能委托给单独的组件是一个好主意。这包括获取当前时间,以及像Thread.sleep()这样的延迟。这样,在测试期间很容易用模拟替换此组件,以及切换到其他实现。


答案 2

我刚刚遇到了一个类似的问题,我创建了一个界面来抽象这个: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();