Upload
-
View
7.523
Download
14
Tags:
Embed Size (px)
DESCRIPTION
Стало интересно, сел и изучил доку http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html
Citation preview
MockitoMockito
* Maddeningly easy to make * Some Mint, Brown Sugar, Lime, Ginger Beer, Ice
Image: http://www.friedchillies.com/index.php/recipes/detail/mock-ito/
Дбавляем в проектДбавляем в проект
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<version>1.8.5</version>
</dependency>
* Доставай свой pom.xmlpom.xml * И добавь туда новую зависимость
1.8.51.8.5
Исходные классыИсходные классы * Класс BarBar – его и будем тестировать!
1.8.51.8.5
Исходные классыИсходные классы * Интерфейс FooFoo – внешняя зависимость
1.8.51.8.5
* Простейшая реализация FooImplFooImpl – так, на всякий
Исходные классыИсходные классы * Класс BarVoidBarVoid – для демонстрации void кейсов
1.8.51.8.5
Исходные классыИсходные классы * Интерфейс FooVoidFooVoid – внешняя зависимость
1.8.51.8.5
* Реализация FooVoidImplFooVoidImpl – тоже на всякий
Исходные классыИсходные классы * Класс Bar2Bar2 – для кейсов с двумя зависимостями
1.8.51.8.5
НастраиваемНастраиваем тесттест * Инит мока и инъекция его в класс BarBar – автоматом!
1.8.51.8.5
НастраиваемНастраиваем тесттест * Но можно и классически
1.8.51.8.5
Совет Совет ##11 * Используй статический импорт
1.8.51.8.5
* MockitoMockito.. перед методами выглядит коряво
Был ли вызов метода?Был ли вызов метода? * Создали мок, создали класс с моком, сделали вызов, проверили вызывался ли мок
1.8.51.8.5
Игнорим входной параметрИгнорим входной параметр * Мало ли, не интересует нас, что передавали * Главное вызов был!
1.8.51.8.5
А как застабить?А как застабить? * То есть заставить мок в ответ на вызов метода вернуть то, что мы хотим
* Что, если передадим не ““qweqwe””? 1.8.51.8.5
Осторожно с параметрамиОсторожно с параметрами * Если вызов будет не с тем параметром – сценарий не сработает
* Как быть? 1.8.51.8.5
Обобщаем в сценарииОбобщаем в сценарии * Обобщай, если не важно, какой параметр
1.8.51.8.5
Проверяем по регуляркеПроверяем по регулярке
1.8.51.8.5
Сценарий по регуляркеСценарий по регулярке
1.8.51.8.5
Проверки строк поПроверки строк по--прощепроще
1.8.51.8.5 * Все это базируется на матчерах * Те самые org.hamcrest.Matcherorg.hamcrest.Matcher
Проверка строк в Проверка строк в verifyverify
1.8.51.8.5 * Те же матчеры можно использовать везде * Как в verifyverify так и в whenwhen
Есть и другие Есть и другие any’any’фикаторфикаторыы
1.8.51.8.5 * Это все - тоже матчеры (org.hamcrestorg.hamcrest)
Проверка на равенство Проверка на равенство * Везде внутри на объектах иcпользуется equalsequals * Есть специальный матчер eqeq, но его можно упускать
1.8.51.8.5
Свой Свой матчерматчер
1.8.51.8.5
* Любителям функционального
А как застабить А как застабить voidvoid?? * Обрати внимание, тут мы взяли FooVoidFooVoid, BarVoidBarVoid
1.8.51.8.5 * Бессмысленная операция (наверное для галочки)
Exclude Exclude в сценариив сценарии * И все же есть смысл в doNothingdoNothing на voidvoid методе
1.8.51.8.5 * Так мы сделаем условие – все, кроме ““qweqwe””
АА если хотим если хотим ExceptionException??
1.8.51.8.5
АА если метод если метод voidvoid??
1.8.51.8.5
Количество вызововКоличество вызовов
1.8.51.8.5 * Это т.н. VerificationModeVerificationMode
ШпионимШпионим
1.8.51.8.5 * Spy работает с реальными объектами
В чем же разница? В чем же разница?
1.8.51.8.5
* Мок класса без сценария return’ит nullnull’ы * Spy – вызывает реальные методы * А еще, Spy работает с объектами
Что Что return’return’ит ит mockmock? ?
1.8.51.8.5
* Если не указано ничего в сценарии
* Для всех CollectionCollection – пустые коллекции * Для примитивов – их default значения * Все остальные объекты - nullnull
Вызов реального методаВызов реального метода
1.8.51.8.5
* Последняя команда повторяется * Не важно thenReturnthenReturn/thenCallRealMethodthenCallRealMethod
Вызов реального методаВызов реального метода
1.8.51.8.5
* Для работы с voidvoid методами – другое API
Программируем Программируем flowflow
1.8.51.8.5
Программируем Программируем flowflow
1.8.51.8.5
* Тут внимание, when2when2 петрет программу whenwhen11
* Просто условие foo.foo(foo.foo(““qweqwe””)) у них одно
Сценарии сумируютсяСценарии сумируются
1.8.51.8.5 * Только, если их условия разные * Порядок учтен в пределах одного условия
Порядок вызовов у двух моковПорядок вызовов у двух моков
1.8.51.8.5
Если стабом не обойтись? Если стабом не обойтись?
1.8.51.8.5
thenAnswerthenAnswer для для voidvoid? ?
* Ой, плохо пахнут эти Answer’Answer’ыы
* Аналог doThrowdoThrow с AnswerAnswer механизмом
1.8.51.8.5
Мок не трогали? Мок не трогали?
1.8.51.8.5
* Проверяем, что мок не трогали вообще
Мок не трогали? Мок не трогали? * Проверяем, что мок больше трогали
1.8.51.8.5
Капчим параметрыКапчим параметры
1.8.51.8.5
* Есть возможность записать, что передавалось
Reset’Reset’ить ить мокмок??
* ResetReset – плохой запах 1.8.51.8.5
Любителям Любителям BDDBDD
1.8.51.8.5 * Импортируйте BDDMockitoBDDMockito вместо MockitoMockito * Там есть аналоги всех методов
Диагностика неисправностиДиагностика неисправности
1.8.51.8.5 * Не знаешь в чем дело? * Вызови validateMockitoUssagevalidateMockitoUssage()()
Диагностика неисправностиДиагностика неисправности
1.8.51.8.5 * Информативно! * С примерчиками и подсказками
Выводы?Выводы?
1.8.51.8.5
* Я перестал юзать потому, что: -- с Mockito я пишу меньше кода -- с Mockito код моих тестов читабельнее -- Mockito проще, но функционально он не уступает -- у Mockito информативнее вывод AssertionErrorAssertionError -- а validateMockitoUssagevalidateMockitoUssage - вообще без комментариев -- у Mockito нет фаз записи/воспроизведения сценария -- а значит ненадо делать replayreplay/replayAllreplayAll -- в Mockito проверки конкретные, а не всего сценария -- в Mockito больше matcher’ов и они reuse’али их -- показалось, обо мне думали разработчики -- а это приятно