SlideShare una empresa de Scribd logo
1 de 46
Descargar para leer sin conexión
Mockito




                Image: http://www.friedchillies.com/index.php/recipes/detail/mock-ito/



* Maddeningly easy to make
* Some Mint, Brown Sugar, Lime, Ginger Beer, Ice
Дбавляем в проект
* Доставай свой pom.xml
* И добавь туда новую зависимость

 <dependency>
     <groupId>org.mockito</groupId>
     <artifactId>mockito-all</artifactId>
     <version>1.8.5</version>
 </dependency>


                                       1.8.5
Исходные классы
* Класс Bar – его и будем тестировать!




                                         1.8.5
Исходные классы
* Интерфейс Foo – внешняя зависимость




* Простейшая реализация FooImpl – так, на всякий




                                             1.8.5
Исходные классы
* Класс BarVoid – для демонстрации void кейсов




                                                 1.8.5
Исходные классы
* Интерфейс FooVoid – внешняя зависимость




* Реализация FooVoidImpl – тоже на всякий




                                            1.8.5
Исходные классы
* Класс Bar2 – для кейсов с двумя зависимостями




                                             1.8.5
Настраиваем тест
* Инит мока и инъекция его в класс Bar – автоматом!




                                               1.8.5
Настраиваем тест
* Но можно и классически




                           1.8.5
Совет #1
* Используй статический импорт


* Mockito. перед методами выглядит коряво
  Mockito.




                                            1.8.5
Был ли вызов метода?
* Создали мок, создали класс с моком,
  сделали вызов, проверили вызывался ли мок




                                              1.8.5
Игнорим входной параметр
* Мало ли, не интересует нас, что передавали
* Главное вызов был!




                                               1.8.5
А как застабить?
* То есть заставить мок в ответ на вызов метода
  вернуть то, что мы хотим




                                                  1.8.5
* Что, если передадим не “qwe”?
                          qwe”
Осторожно с параметрами
* Если вызов будет не с тем параметром –
  сценарий не сработает




                                           1.8.5
* Как быть?
Обобщаем в сценарии
* Обобщай, если не важно, какой параметр




                                           1.8.5
Проверяем по регулярке




                    1.8.5
Сценарий по регулярке




                   1.8.5
Проверки строк по-проще
               по-




* Все это базируется на матчерах   1.8.5
* Те самые org.hamcrest.Matcher
Проверка строк в verify




* Те же матчеры можно использовать везде   1.8.5
* Как в verify так и в when
Есть и другие any’фикаторы
              any’фикаторы




                                          1.8.5
* Это все - тоже матчеры (org.hamcrest
                          org.hamcrest)
Проверка на равенство
* Везде внутри на объектах иcпользуется equals
* Есть специальный матчер eq но его можно упускать
                           eq,




                                             1.8.5
Свой матчер




                              1.8.5
* Любителям функционального
А как застабить void?
                   void?
* Обрати внимание, тут мы взяли FooVoid BarVoid
                                FooVoid,




* Бессмысленная операция (наверное для галочки)
                                             1.8.5
Exclude в сценарии
* И все же есть смысл в doNothing на void методе




* Так мы сделаем условие – все, кроме “qwe”
                                       qwe”
                                               1.8.5
А если хотим Exception?
             Exception?




                     1.8.5
А если метод void?
             void?




                     1.8.5
Количество вызовов




                              1.8.5
* Это т.н. VerificationMode
Шпионим




* Spy работает с реальными объектами   1.8.5
В чем же разница?




* Мок класса без сценария return’ит null
                                    null’ы
* Spy – вызывает реальные методы
* А еще, Spy работает с объектами            1.8.5
Что return’ит mock?
        return’ит mock?
* Если не указано ничего в сценарии




* Для всех Collection – пустые коллекции
* Для примитивов – их default значения
* Все остальные объекты - null             1.8.5
Вызов реального метода




* Последняя команда повторяется
* Не важно thenReturn thenCallRealMethod
           thenReturn/thenCallRealMethod   1.8.5
Вызов реального метода
* Для работы с void методами – другое API




                                            1.8.5
Программируем flow




                 1.8.5
Программируем flow




* Тут внимание, when2 петрет программу when1
                                         when1
* Просто условие foo.foo(“qwe”) у них одно
                 foo.foo(“qwe”                 1.8.5
Сценарии сумируются




* Только, если их условия разные
* Порядок учтен в пределах одного условия   1.8.5
Порядок вызовов у двух моков




                         1.8.5
Если стабом не обойтись?




                     1.8.5
thenAnswer для void?
                  void?
* Аналог doThrow с Answer механизмом




                                       1.8.5
* Ой, плохо пахнут эти Answer’ы
                       Answer’ы
Мок не трогали?
* Проверяем, что мок не трогали вообще




                                         1.8.5
Мок не трогали?
* Проверяем, что мок больше трогали




                                      1.8.5
Капчим параметры
* Есть возможность записать, что передавалось




                                                1.8.5
Reset’ить мок?
         Reset’ить мок?




                          1.8.5
* Reset – плохой запах
Любителям BDD




* Импортируйте BDDMockito вместо Mockito   1.8.5
* Там есть аналоги всех методов
Диагностика неисправности




* Не знаешь в чем дело?            1.8.5
* Вызови validateMockitoUssage()
         validateMockitoUssage()
Диагностика неисправности




* Информативно!                  1.8.5
* С примерчиками и подсказками
Выводы?
* Я перестал юзать                   потому, что:
-- с Mockito я пишу меньше кода
-- с Mockito код моих тестов читабельнее
-- Mockito проще, но функционально он не уступает
-- у Mockito информативнее вывод AssertionError
-- а validateMockitoUssage - вообще без комментариев
-- у Mockito нет фаз записи/воспроизведения сценария
-- а значит ненадо делать replay replayAll
                          replay/replayAll
-- в Mockito проверки конкретные, а не всего сценария
-- в Mockito больше matcher’ов и они reuse’али их
-- показалось, обо мне думали разработчики        1.8.5
-- а это приятно

Más contenido relacionado

Destacado

Java Core. Lecture# 3. Part# 3. Multithreading.
Java Core. Lecture# 3. Part# 3. Multithreading.Java Core. Lecture# 3. Part# 3. Multithreading.
Java Core. Lecture# 3. Part# 3. Multithreading.Anton Moiseenko
 
Java Unit Testing with Unitils
Java Unit Testing with UnitilsJava Unit Testing with Unitils
Java Unit Testing with UnitilsMikalai Alimenkou
 
Automated testing dojo - how to play game
Automated testing dojo - how to play gameAutomated testing dojo - how to play game
Automated testing dojo - how to play gameOleksandr Baglai
 
5. java lecture io
5. java lecture io5. java lecture io
5. java lecture ioMERA_school
 
Design and Evolution of cyber-dojo
Design and Evolution of cyber-dojoDesign and Evolution of cyber-dojo
Design and Evolution of cyber-dojoJon Jagger
 
Между молотом и наковальней. Production Quality
Между молотом и наковальней. Production QualityМежду молотом и наковальней. Production Quality
Между молотом и наковальней. Production QualitySQALab
 
Great functional testing with WebDriver and Thucydides
Great functional testing with WebDriver and ThucydidesGreat functional testing with WebDriver and Thucydides
Great functional testing with WebDriver and ThucydidesMikalai Alimenkou
 
Thucydides – next generation acceptance testing with WebDriver
Thucydides – next generation acceptance testing with WebDriverThucydides – next generation acceptance testing with WebDriver
Thucydides – next generation acceptance testing with WebDriverMikalai Alimenkou
 
С чего начинается родина в автоматизации Qiwi Wallet
С чего начинается родина в автоматизации Qiwi WalletС чего начинается родина в автоматизации Qiwi Wallet
С чего начинается родина в автоматизации Qiwi WalletSQALab
 

Destacado (16)

Mockito tutorial for beginners
Mockito tutorial for beginnersMockito tutorial for beginners
Mockito tutorial for beginners
 
Айтишник
АйтишникАйтишник
Айтишник
 
Java Core. Lecture# 3. Part# 3. Multithreading.
Java Core. Lecture# 3. Part# 3. Multithreading.Java Core. Lecture# 3. Part# 3. Multithreading.
Java Core. Lecture# 3. Part# 3. Multithreading.
 
Java Unit Testing with Unitils
Java Unit Testing with UnitilsJava Unit Testing with Unitils
Java Unit Testing with Unitils
 
Automated testing dojo - how to play game
Automated testing dojo - how to play gameAutomated testing dojo - how to play game
Automated testing dojo - how to play game
 
Java.io
Java.ioJava.io
Java.io
 
5. java lecture io
5. java lecture io5. java lecture io
5. java lecture io
 
XP
XPXP
XP
 
Design and Evolution of cyber-dojo
Design and Evolution of cyber-dojoDesign and Evolution of cyber-dojo
Design and Evolution of cyber-dojo
 
Agile Evolution
Agile EvolutionAgile Evolution
Agile Evolution
 
Между молотом и наковальней. Production Quality
Между молотом и наковальней. Production QualityМежду молотом и наковальней. Production Quality
Между молотом и наковальней. Production Quality
 
Great functional testing with WebDriver and Thucydides
Great functional testing with WebDriver and ThucydidesGreat functional testing with WebDriver and Thucydides
Great functional testing with WebDriver and Thucydides
 
Mockito
MockitoMockito
Mockito
 
Why testing take so long
Why testing take so longWhy testing take so long
Why testing take so long
 
Thucydides – next generation acceptance testing with WebDriver
Thucydides – next generation acceptance testing with WebDriverThucydides – next generation acceptance testing with WebDriver
Thucydides – next generation acceptance testing with WebDriver
 
С чего начинается родина в автоматизации Qiwi Wallet
С чего начинается родина в автоматизации Qiwi WalletС чего начинается родина в автоматизации Qiwi Wallet
С чего начинается родина в автоматизации Qiwi Wallet
 

Саша Баглай. Как работать с Mockito