JUnit Test запланированная логика воздействия без использования Thread.sleep

У меня есть TimerTask, реализованный в моем коде. Он периодически вносит некоторые изменения в логику приложения. Теперь я хочу проверить влияние этого TimerTask с помощью JUnit. Скажем, 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

        }
    }
}

Один из сценариев модульного тестирования заключается в том, что я получаю loggingDetails в течение периода времени ожидания. Это нормально для реализации. Другой сценарий заключается в том, что я должен проверить и подтвердить, что после времени ожидания список очищается и становится нулевым.


person TV Nath    schedule 30.11.2016    source источник
comment
Я думаю, нам нужно больше подробностей о ваших потребностях, но вы можете заглянуть в JMockit, который, я думаю, позволяет вам издеваться некоторые системные методы, такие как Thread.sleep или методы, возвращающие текущее время.   -  person ajb    schedule 30.11.2016


Ответы (1)


В вашем случае я бы разделил модульные тесты для LogService и ScheduledAgent.

Таким образом вы добьетесь того, что сможете протестировать реальную логику ScheduledAgent.

Другой случай: в тесте для LogService вы должны убедиться, что метод scheduleAtFixedRate был вызван с правильными параметрами. Для этого вы можете использовать какую-нибудь библиотеку, например JMockit или PowerMockito. Скорее всего, вам нужно будет сделать timer полем класса, чтобы получить возможность издеваться над ним. С моей точки зрения, вам не нужно проверять, что метод scheduleAtFixedRate периодически вызывает предоставленный TimerTask, потому что этот метод взят из JDK и наверняка уже протестирован тысячами разработчиков.

person Rufi    schedule 30.11.2016