Ковток МоКіто

А Ви знаєте, що таке mock-об'єкт? Ні?

Що ж говорить із цього приводу вікіпедія: «В об'єктно-орієнтованому програмуванні mock-об'єкт імітує поведінку реального об'єкта заданим чином…». Здавалося б навіщо? Вікіпедія продовжує: «Під час unit-тестування mock-об'єкти можуть симулювати поведінку бізнес-об'єктів та бізнес-логіку, що іноді необхідно через складність реальної поведінки»

І що ж дають mock-бібліотеки java-розробнику? Звичайно ж зручність створення та використання тих самих mock-об'єктів!

java-source.net наводить список аж із 7 бібліотек:

  • EasyMock
  • Mocquer
  • MockLib
  • Mockrunner
  • jMock
  • MockEJB
  • MockCreator
Я почав знайомство з mock-об'єктами з іншої бібліотеки, якої немає на java-source.net - Mockito. Я просто довірився думці javaposse, що визнали mockito бібліотекою тижня, а також настрою java-блогосфери і не розчарувався. Ви також оціните, наскільки це зручно:

Увага! Зробивши ковток - зупинитися неможливо.

Перевіряємо поведінку

Copy Source Copy HTML

  1. //статично імпортуємо методи (для краси та легкості коду)
  2. import static org.mockito.Mockito.*;
  3. //Ось він - mock-об'єкт (зауважте: List. class - це інтерфейс)
  4. List mockedList = mock(List. class);
  5. //використовуємо його
  6. mockedList. add ("one");
  7. mockedList.clear();
  8. //перевіряємо, чи були викликані методи add з параметром "one" та clear
  9. verify(mockedList). add ("one");
  10. verify(mockedList).clear();

А як же stub'и?

Copy Source Copy HTML

  1. //Ви можете створювати mock для конкретного класу, не тільки для інтерфейсу
  2. LinkedList mockedList = mock(LinkedList.class);
  3. //stub'інг
  4. when (mockedList. get (0)).thenReturn("first ");
  5. when (mockedList. get (1)).thenThrow( new RuntimeException());
  6. //отримаємо "first"
  7. System. out .println(mockedList. get (0));
  8. //отримаємо RuntimeException
  9. System. out .println(mockedList. get (1));
  10. //отримаємо " null " бо get (999) був визначено
  11. System. out .println(mockedList. get (999));

Перевіряємо точну кількість викликів

Copy Source Copy HTML

  1. //використовуємо mock-об'єкт
  2. mockedList. add ("once");
  3. mockedList. add («twice»);
  4. mockedList. add («twice»);
  5. mockedList. add ("three times");
  6. mockedList. add ("three times");
  7. mockedList. add ("three times");
  8. //за умовчанням перевірка, що викликався 1 раз

times(1)

  • verify(mockedList). add ("once");
  • verify(mockedList, times(1)). add ("once");
  • //точна кількість викликів
  • verify(mockedList, times(2)). add («twice»);
  • verify(mockedList, times(3)). add ("three times");
  • // Ніколи
  • times(0)

  • verify(mockedList, never()). add («never happened»);
  • //як мінімум, як максимум
  • verify(mockedList, atLeastOnce()). add ("three times");
  • verify(mockedList, atLeast(2)). add («five times»);
  • verify(mockedList, atMost(5)). add ("three times");
  • Паразитуємо на реальних об'єктах

    Copy Source Copy HTML

    1. List list = New LinkedList();
    2. List spy = spy (list);
    3. //опціонально, визначаємо лише метод size()
    4. when (spy. size ()).thenReturn(100);
    5. //використовуємо реальні методи
    6. spy. add ("one");
    7. spy. add ("two");
    8. //отримаємо "one"
    9. System. out.println(spy. get (0));
    10. //метод size () нами перевизначено - отримаємо 100
    11. System. out .println(spy. size());
    12. //можемо перевірити
    13. verify(spy). add ("one");
    14. verify(spy). add ("two");

    Хардкорна конфа за С++. Ми запрошуємо лише профі.