JUnit测试计划影响逻辑,不使用Thread.sleep

时间:2016-11-30 07:30:57

标签: java unit-testing junit timertask thread-sleep

我的代码中实现了TimerTask。它会定期对应用程序逻辑进行一些修改。现在我想用JUnit测试这个TimerTask的影响。假设TimerTask计划每2秒运行一次,但我应该在不使用Thread.sleep的情况下运行测试用例。

public class LogService {

    public LogService() {
        configuration = ConfigurationUtil.getConfgiration();
        Timer timer = new Timer(true);
        timer.scheduleAtFixedRate(new ScheduledAgent(), 0, configuration.getWaitTime());
    }

    private List<LoggingDetails> loggingDetails;

    public List<LoggingDetails> getLoggers() {
        return loggingDetails;

    }

    class ScheduledAgent extends TimerTask {

        @Override
        public void run() {
            // if time has taken more than wait time, then clear loggingDetails

        }
    }
}

一个单元测试场景是我在waitTime时间段内获取loggingDetails。这可以实现。另一种情况是我应该测试并确认在等待时间之后清单并清空。

1 个答案:

答案 0 :(得分:1)

在您的情况下,我会将LogServiceScheduledAgent的单元测试分开。

因此,您将实现可以测试ScheduledAgent的实际逻辑。

另一种情况是,在LogService的测试中,您必须检查scheduleAtFixedRate方法是否使用正确的参数调用 。为此,您可以使用某些库,例如JMockitPowerMockito。最有可能你需要将timer作为类的一个字段来实现模拟它的可能性。从我的角度来看,您不需要测试scheduleAtFixedRate方法是否定期调用TimerTask,因为此方法来自JDK,并且肯定已经有数千名开发人员测试过。