Ковток МоКіто
А Ви знаєте, що таке mock-об'єкт? Ні?
Що ж говорить із цього приводу вікіпедія: «В об'єктно-орієнтованому програмуванні mock-об'єкт імітує поведінку реального об'єкта заданим чином…». Здавалося б навіщо? Вікіпедія продовжує: «Під час unit-тестування mock-об'єкти можуть симулювати поведінку бізнес-об'єктів та бізнес-логіку, що іноді необхідно через складність реальної поведінки»
І що ж дають mock-бібліотеки java-розробнику? Звичайно ж зручність створення та використання тих самих mock-об'єктів!
java-source.net наводить список аж із 7 бібліотек:
- EasyMock
- Mocquer
- MockLib
- Mockrunner
- jMock
- MockEJB
- MockCreator
Увага! Зробивши ковток - зупинитися неможливо.
Перевіряємо поведінку
Copy Source Copy HTML
- //статично імпортуємо методи (для краси та легкості коду)
- import static org.mockito.Mockito.*;
- //Ось він - mock-об'єкт (зауважте: List. class - це інтерфейс)
- List mockedList = mock(List. class);
- //використовуємо його
- mockedList. add ("one");
- mockedList.clear();
- //перевіряємо, чи були викликані методи add з параметром "one" та clear
- verify(mockedList). add ("one");
- verify(mockedList).clear();
А як же stub'и?
Copy Source Copy HTML
- //Ви можете створювати mock для конкретного класу, не тільки для інтерфейсу
- LinkedList mockedList = mock(LinkedList.class);
- //stub'інг
- when (mockedList. get (0)).thenReturn("first ");
- when (mockedList. get (1)).thenThrow( new RuntimeException());
- //отримаємо "first"
- System. out .println(mockedList. get (0));
- //отримаємо RuntimeException
- System. out .println(mockedList. get (1));
- //отримаємо " null " бо get (999) був визначено
- System. out .println(mockedList. get (999));
Перевіряємо точну кількість викликів
Copy Source Copy HTML
- //використовуємо mock-об'єкт
- mockedList. add ("once");
- mockedList. add («twice»);
- mockedList. add («twice»);
- mockedList. add ("three times");
- mockedList. add ("three times");
- mockedList. add ("three times");
- //за умовчанням перевірка, що викликався 1 раз
times(1)
times(0)
Паразитуємо на реальних об'єктах
Copy Source Copy HTML
- List list = New LinkedList();
- List spy = spy (list);
- //опціонально, визначаємо лише метод size()
- when (spy. size ()).thenReturn(100);
- //використовуємо реальні методи
- spy. add ("one");
- spy. add ("two");
- //отримаємо "one"
- System. out.println(spy. get (0));
- //метод size () нами перевизначено - отримаємо 100
- System. out .println(spy. size());
- //можемо перевірити
- verify(spy). add ("one");
- verify(spy). add ("two");
Хардкорна конфа за С++. Ми запрошуємо лише профі.