27.06.2011

Mock-тестирование mockito

Для mock-тестирования лично мне больше всего нравится mockito, актуальная версия на сегодняшний день - 1.8.5.

Посмотрим как тестировать, например, EJB stateless бин с помощью mockito.

Суть mock-тестирования в том, что мы тестируем только один, интересующий нас класс, подразумевая, что все классы, услугами которых он пользуется работают как надо.

Допустим наш stateless берет на себя работу по
 1. сбору данных со стороннего сервиса,
 2. изменение этих данных и
 3. кеширование измененного результата.

Причем сервисы сбора и кеширования уже реализованы в других EJB. Исходный код таков:

@Stateless
public class DataBean implements DataLocal {
  @EJB CacheProvider cache;
  @EJB DataGrabber grabber;

   public void doWork() {
     // 1. Получаем данные со стороннекго сервиса
     PieceOfData data = grabber.fetchData(new Date());
   
    // 2. Трансформируем данные
    TransformedData result = DataTransformer.transform(data);

    cache.put(result); // 3. Кешируем данные
  }
}

Плохо знакомый с mock-ами разработчик обычно встает перед вопросом - а как же нам протестировать работу DataBean, с mockito это очень даже просто.

import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import static org.mockito.Mockito.*;
...
@RunWith(MockitoJUnitRunner.class) // (1)
public class ResultsBeanTest {

    @Mock // (2)
    CacheProvider cache;
    @Mock
    DataGrabber grabber;
    @InjectMocks // (3)
    private DataBean bean = new DataBean();

    @Test
    public void doWorkPerfectly() {
      PieceOfData correctPieceOfData = ...; // (4)
      TransformedData correctResult = ...

       // (5)
       when(grabber.fetchData(any())).thenReturn(correctPieceOfData);

      // (6)
      bean.doWork();

      // (7)
      verify(cache).put(correctResult);
    }
}

(1) - запускать тест будем с помощью специального mockito-runner-а.
(2) - аннотируем @Mock объект, работа которого нас не интересует, считаем что он работает как надо, делаем из него mock.
(3) - создаем тестируемый объект, с помощью аннотации инжектируем в него созданные ранее mock-объекты
(4) - создаем объекты содержащие исходные данные для тестирования и объекты для сравнения результатов
(5) - задаем поведение mock-ов
(6) - вызываем тестируемый метод
(7) - проверяем положил ли тестируемый объект то что нужно в кеш.

18.06.2011

Память эмоциональна

И не только память. Когда-то мы приезжали на Дно, брали пива, шли на набережную или в струковский сад и морально отдыхали. Это было лучшее в мире пиво. Сегодня был в самаре - это пиво до сих пор лучшее в мире ;)

10.05.2011

В.О.В.
Юрий Нестеренко


И было так: четыре года
В грязи, в крови, в огне пальбы
Рабы сражались за свободу,
Не зная, что они - рабы.
А впрочем - зная. Вой снарядов
И взрывы бомб не так страшны,
Как меткий взгляд заградотрядов,
В тебя упертый со спины.
И было ведомо солдатам,
Из дома вырванным войной,
Что города берутся - к датам.
А потому - любой ценой.
Не пасовал пред вражьим станом,
Но опускал покорно взор
Пред особистом-капитаном
Отважный боевой майор.
И генералам, осужденным
В конце тридцатых без вины,
А после вдруг освобожденным
Хозяином для нужд войны,
Не знать, конечно, было б странно,
Имея даже штат и штаб,
Что раб, по прихоти тирана
Возвышенный - все тот же раб.
Так значит, ведали. И все же,
Себя и прочих не щадя,
Сражались, лезли вон из кожи,
Спасая задницу вождя.
Снося бездарность поражений,
Где миллионы гибли зря,
А вышедшим из окружений
Светил расстрел иль лагеря,
Безропотно терпя такое,
Чего б терпеть не стали псы,
Чтоб вождь рябой с сухой рукою
Лукаво щерился в усы.
Зачем, зачем, чего же ради -
Чтоб говорить бояться вслух?
Чтоб в полумертвом Ленинграде
От ожиренья Жданов пух?
Чтоб в нищих селах, все отдавших,
Впрягались женщины в ярмо?
Чтоб детям без вести пропавших
Носить предателей клеймо?
Ах, если б это было просто -
В той бойне выбрать верный флаг!
Но нет, идеи Холокоста
Ничуть не лучше, чем ГУЛАГ.
У тех - все то же было рабство,
А не пропагандистский рай.
Свобода, равенство и братство...
Свободный труд. Arbeit macht frei.
И неизменны возраженья,
Что, дескать, основная часть
Из воевавших шла в сраженья
Не за советскую-де власть,
Мол, защищали не колхозы
И кровопийцу-подлеца,
А дом, семью и три березы,
Посаженных рукой отца...
Но отчего же половодьем
Вослед победе в той войне
Война со сталинским отродьем
Не прокатилась по стране?
Садили в небеса патроны,
Бурлил ликующий поток,
Но вскоре - новые вагоны
Везли их дальше на восток.
И те, кого вела отвага,
Кто встал стеною у Москвы -
За проволоками ГУЛАГа
Поднять не смели головы.
Победа... Сделал дело - в стойло!
Свобода... Северная даль.
Сорокаградусное пойло,
Из меди крашеной медаль.
Когда б и впрямь они парадом
Освободителей прошли,
То в грязь со свастиками рядом
И звезды б красные легли.
Пусть обуха не сломишь плетью,
Однако армия - не плеть!
Тому назад уж полстолетья
Режим кровавый мог истлеть.
И все ж пришел конец запретам,
Но, те же лозунги крича,
Плетется дряхлый раб с портретом
Того же горца-усача.
Он страшно недоволен строем,
Трехцветным флагом и гербом...
Раб тоже может быть героем,
Но все ж останется рабом.
И что ж мы празднуем в угоду
Им всем девятого числа?
Тот выиграл, кто обрел свободу.
Ну что же, Дойчланд - обрела.
А нас свобода только дразнит,
А мы - столетьями в плену...
На нашей улице - не праздник.
Мы проиграли ту войну.

05.05.2011

стать умнее

есть ровно один способ стать умнее - беседовать с умными людьми. все остальные способы - в той или иной степени производные от него

25.04.2011

месяц конференций

месяц конференций подходит к концу.

В апреле посетил JavaOne и SQA Days. Что неожиданно - sqa days был интереснее и полезнее. На программистских конференциях говорят только о программировании, а на sqa говорили далеко не только о тестировании, а говорили о такой сложности в разработке ПО как общение, взаимодействие. Говорилось больше о людях, а не технологиях.

Советовал бы разработчикам посетить sqa days скорее чем java one.

23.03.2011

Обязательные предметы в школе

Вот какие предметы в школе я бы сдела обязательными. Причем у обязательных предметов должен быть простой и железный метод контроля знаний "на зачет" или "на троечку".
  1. Литература. Именно литература, без русского языка. На троечку нужно тупо прочитать N книг из списка M книг. Составить тесты, чтобы удостовериться что человек прочитал не составит труда.
  2. Математика. Включая геометрию. На троечку нужно понимать основные вещи, решать простые задачи, знать что такое теоремы, уметь доказывать основные.
  3. Право. Без этого в современном мире никуда. Конституция, ПДД, законы о полиции, права и обязанности граждан и должностных лиц в разных ситуациях. Знания проверяются тестами.
  4. Логика. Может быть предмет лучше назвать иначе. Суть в том, чтобы понимать речь и строить речь, высказывания, мысли. И видеть нелогичные высказывания, демагогию, подмену понятий и т.п. На троечку можно делать тесты.
  5. Естествознание. Основы законов природы. Сбор из физики, химии, географии, биологии и т.п. Контроль опять возможен тестами.
 Все остальное факультативно по выбору ребенка/родителей. Ибо все равно никто ничего не учит.

18.03.2011

Один поставщик, множество потребителей

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

Решение.
  1. Сервис1 ежесекундно опрашивает поставщика, получает от него данные, пишет их в кеш.
  2. Сервис2 раз в несколько минут сливает кеш в базу, где данные хранятся вечно.
  3. Большинству потребителей отдаем данные из кеша, лишь тем кому нужны архивные данные - отдаем данные из базы.
Нашел инструмент для подобного решения - prevayler.