Как использовать макет объекта, имитирующий повседневную программу?

StackOverflow https://stackoverflow.com/questions/1143322

Вопрос

В моей программе есть распорядок дня, похожий на срабатывание будильника.Скажем, когда наступит 14:00 (это системное время моего компьютера), сделайте что-нибудь для меня.

Что я хочу сделать, так это ускорить период тестирования (я действительно не хочу ждать 4 дня, просматривая распорядок дня и проверяя ошибки.) Я читаю дальше wiki макетного объекта, автор ДЕЙСТВИТЕЛЬНО упоминал программу-будильник.Я была так рада это видеть, но все равно не знаю, как это сделать.

Я новичок в Mock Object, и я программирую на Java.Так что JMock или EasyMock (или любой подобный) могли бы подойти мне.

Спасибо

Это было полезно?

Решение

Всякий раз, когда вам нужно узнать текущее время, не используйте системные часы напрямую — используйте такой интерфейс, как:

public interface Clock
{
    long currentMillis();
}

Затем вы можете реализовать это с помощью системных часов для производства и передать подделку для тестов, где вы можете установить подделку на любое время, которое захотите.

Однако вам также нужно будет смоделировать то, что движет вашей системой: вы явно ждете определенного времени или что-то еще вызывает ваш код?

Другие советы

Я должен извиниться, поскольку вы спросили о java, а я ухожу на ланч, когда речь заходит о java, но одно из решений - смоделировать объект DateTime и установить его на желаемое время.

В .NET это выглядело бы примерно так:

public static class SystemTime
{
    public static Func<DateTime> Now = () => DateTime.Now;
}

SystemTime.Now = () => new DateTime(2000,1,1);

От: Работа со временем В Тестах


...[A] программа будильника, которая вызывает звонок в определенное время, может получать текущее время из внешнего мира.Чтобы проверить это, тест должен дождаться времени срабатывания будильника, чтобы узнать правильно ли прозвенел звонок .Если mock-объект используется в место реального объекта, она может быть запрограммирован для обеспечения колокольный звон времени (является ли это на самом деле того времени или нет) так что будильник программу можно тестировать изолированно.

Этот будильник, на который вы ссылаетесь, дает пример издевательства над объектом.На самом деле это не объект, который вы можете использовать из макетного фреймворка.

По сути, в тесте вы подделываете события часов.Как именно это зависит от дизайна и того, как вы ждете события, но, чтобы сохранить простоту (если не чистоту), мой подход заключался бы в том, чтобы иметь метод, который вызывается при запуске события времени, а затем тестировать обе стороны. того, что.

Во-первых, нужно протестировать вызов метода и убедиться, что синхронизированное событие делает то, что вы ожидаете.Затем издевайтесь над этим классом (при использовании JMock предпочтительный способ — сделать его интерфейсом и заставить ваш вызывающий метод реализовать этот интерфейс).

Затем вы передаете макет классу, который обрабатывает время.И здесь я бы абстрагировался от проблем с потоками/запуском (таких как проверка системных часов и запуск потока) и использовал возвращаемые значения, которые, по сути, сразу запускают событие.

Затем оставьте реальный код, который фактически считывает системные часы и запускает поток, как можно меньшим, и это будет область, которая не подвергается модульному тестированию.

Издевательство относится к модульному тестированию.Для функциональности, которую вы описываете, я бы отделил триггер (в вашем случае событие будильника) от процесса (независимо от того, что делает ваша «повседневная рутина») и провел модульное тестирование функциональности процесса.

Затем обратите внимание на код планирования, который будет активировать функциональность вашего процесса.Я бы рекомендовал использовать что-то вроде Кварц для этого, но если ты собираешься роль твоя модульный тест для него может работать с фактическими системными часами при условии, что вы назначаете время триггера на основе текущего значения системных часов, поскольку все, что вы будете тестировать, - это возникновение события триггера.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top