Как использовать макет объекта, имитирующий повседневную программу? - PullRequest
1 голос
/ 17 июля 2009

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

Что я хочу сделать, так это ускорить период тестирования (я действительно не хочу ждать 4 дня, просматривая распорядок дня и проверяя ошибки.) Я читаю на вики объекта Mock автор упоминал программу будильника. Я был так рад видеть, но все же, не знаю, как это сделать.

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

Спасибо

Ответы [ 4 ]

4 голосов
/ 17 июля 2009

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

public interface Clock
{
    long currentMillis();
}

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

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

1 голос
/ 17 июля 2009

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

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

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

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

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

<ч />

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

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

0 голосов
/ 17 июля 2009

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

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

0 голосов
/ 17 июля 2009

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

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

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

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

...