HTML Diff
110 added 2 removed
Original 2026-01-01
Modified 2026-02-26
1 - <h2>Ответы</h2>
1 + <p>Mockito - это фреймворк для модульного тестирования, который создаёт фиктивные объекты и позволяет изолировать классы от их реальных зависимостей. Библиотека формирует моки и шпионы, контролирует их поведение и фиксирует вызываемые методы. Инструмент используют для проверки логики кода в сценариях, где работа настоящих зависимостей нежелательна или затруднена.</p>
2 - <p>Mockito - это библиотека для создания и управления mock-объектами в тестовых классах, написанных на языке программирования Java. Mock-объекты представляют собой искусственные объекты, которые используются для имитации поведения других объектов в процессе тестирования. Библиотека Mockito упрощает создание и использование mock-объектов, позволяя разработчикам сосредоточиться на тестировании логики своего кода.</p>
2 + <p>Mockito подменяет интерфейсы, классы и статические вызовы. Фиктивные объекты принимают команды теста, возвращают заранее определённые значения, фиксируют параметры вызовов и позволяют проверять, взаимодействовал ли тестируемый код с зависимостью так, как ожидалось. Такой подход упрощает локальную проверку логики и снижает количество требуемой инфраструктуры.</p>
 
3 + <h2>Назначение Mockito</h2>
 
4 + <p>Mockito используют для тестирования классов, которые зависят от внешних сервисов, баз данных, сетевых клиентов, файловых хранилищ или сложных систем. Реальные объекты заменяются имитаторами, чтобы:</p>
 
5 + <ul><li><p>задать результат вызова метода без выполнения настоящей логики;</p>
 
6 + </li>
 
7 + <li><p>контролировать сценарии, которые сложно или невозможно воспроизвести в реальной среде;</p>
 
8 + </li>
 
9 + <li><p>фиксировать обращения к методам и проверять их количество и параметры;</p>
 
10 + </li>
 
11 + <li><p>упрощать структуру тестов и сокращать их время выполнения.</p>
 
12 + </li>
 
13 + </ul><p>Моки и шпионы относятся к тестовым двойникам. Эти объекты подменяют поведение зависимостей, обеспечивая контролируемую среду выполнения. Mockito предоставляет API для создания таких двойников, настройки их поведения и проверки взаимодействий.</p>
 
14 + <h2>Принцип работы Mockito</h2>
 
15 + <p>Mockito создаёт фиктивные реализации и перехватывает обращение к методам. Для моков библиотека генерирует пустую версию объекта, на которую можно навесить поведение. Для шпионов используется реальный экземпляр - шпион сохраняет делегирование настоящей логике, но фиксирует вызовы.</p>
 
16 + <p>Механизм работы основан на:</p>
 
17 + <ul><li><p>генерации подставных объектов во время выполнения;</p>
 
18 + </li>
 
19 + <li><p>перенаправлении вызовов методов к внутренней прослойке Mockito;</p>
 
20 + </li>
 
21 + <li><p>хранении сценариев поведения, заданных через API;</p>
 
22 + </li>
 
23 + <li><p>проверке фактов взаимодействия после выполнения тестируемого кода.</p>
 
24 + </li>
 
25 + </ul><h2>Подключение Mockito</h2>
 
26 + <p>Библиотека подключается к проекту через Gradle или Maven. Пример конфигурации Gradle:</p>
 
27 + <p>Подключение через Maven:</p>
 
28 + <p>Для интеграции с JUnit 5 используется расширение MockitoExtension:</p>
 
29 + <h2>Юнит-тестирование и тестовые двойники</h2>
 
30 + <p>Юнит-тест проверяет отдельный метод или класс в изоляции. Реальные зависимости обычно не используются, потому что:</p>
 
31 + <ul><li><p>их поведение сложно контролировать;</p>
 
32 + </li>
 
33 + <li><p>выполнение может быть дорогостоящим или нестабильным;</p>
 
34 + </li>
 
35 + <li><p>требуется моделировать разные ответы зависимостей.</p>
 
36 + </li>
 
37 + </ul><p>Классические типы двойников:</p>
 
38 + <ul><li><p>заглушки - жёстко заданное поведение;</p>
 
39 + </li>
 
40 + <li><p>моки - объекты, чьё поведение настраивает тест;</p>
 
41 + </li>
 
42 + <li><p>шпионы - обёртки над реальными объектами, фиксирующие вызовы.</p>
 
43 + </li>
 
44 + </ul><p>Mockito чаще всего применяет моки и шпионы. Моки создаются автоматически, шпионы требуют базовый экземпляр реального класса.</p>
 
45 + <h2>Моки</h2>
 
46 + <p>Мок перехватывает вызовы методов и возвращает указанные тестом значения. Он не выполняет реальной логики. Мок фиксирует, какие методы были вызваны, сколько раз, с какими параметрами.</p>
 
47 + <p>Принципы использования:</p>
 
48 + <ol><li><p>создать экземпляр мока;</p>
 
49 + </li>
 
50 + <li><p>задать ожидаемое поведение методом when().thenReturn() или when().thenThrow();</p>
 
51 + </li>
 
52 + <li><p>передать мок в тестируемый класс;</p>
 
53 + </li>
 
54 + <li><p>выполнить тестируемый код;</p>
 
55 + </li>
 
56 + <li><p>проверить состояние или взаимодействие.</p>
 
57 + </li>
 
58 + </ol><h2>Шпионы</h2>
 
59 + <p>Шпион оборачивает реальный объект. Вызовы передаются настоящим методам, но доступны для наблюдения. Шпион подходит для частичной подмены поведения или проверки факта вызова без полного переписывания логики.</p>
 
60 + <p>Пример использования оправдан, если требуется контролировать отдельные методы, но при этом сохранить работу остального функционала.</p>
 
61 + <h2>Создание моков</h2>
 
62 + <p>Mockito предоставляет несколько способов создания фиктивных объектов:</p>
 
63 + <ul><li><p>через аннотацию @Mock в сочетании с @ExtendWith(MockitoExtension.class);</p>
 
64 + </li>
 
65 + <li><p>через статический метод mock();</p>
 
66 + </li>
 
67 + <li><p>через аннотацию @Spy для создания шпионов;</p>
 
68 + </li>
 
69 + <li><p>через расширение MockitoAnnotations.</p>
 
70 + </li>
 
71 + </ul><p>Пример модели данных:</p>
 
72 + <p>Пример теста:</p>
 
73 + <p>Тест выполняет действия:</p>
 
74 + <ul><li><p>создаёт мок зависимого класса;</p>
 
75 + </li>
 
76 + <li><p>задаёт возврат значения при вызове метода isAvailable;</p>
 
77 + </li>
 
78 + <li><p>передаёт мок в тестируемый объект;</p>
 
79 + </li>
 
80 + <li><p>вызывает метод;</p>
 
81 + </li>
 
82 + <li><p>проверяет результат выполнения.</p>
 
83 + </li>
 
84 + </ul><h2>Значения по умолчанию</h2>
 
85 + <p>Если для вызова метода мока не задано поведение, Mockito возвращает:</p>
 
86 + <ul><li><p>null для объектов;</p>
 
87 + </li>
 
88 + <li><p>0 для чисел;</p>
 
89 + </li>
 
90 + <li><p>false для булевых значений;</p>
 
91 + </li>
 
92 + <li><p>пустые коллекции.</p>
 
93 + </li>
 
94 + </ul><p>Такая политика исключает побочные эффекты во время выполнения тестов.</p>
 
95 + <h2>Настройка поведения</h2>
 
96 + <p>Цепочка when(...).thenReturn(...) настраивает возврат значения. В зависимости от аргументов можно задавать разные сценарии. Mockito поддерживает сопоставители:</p>
 
97 + <ul><li><p>anyString();</p>
 
98 + </li>
 
99 + <li><p>anyInt();</p>
 
100 + </li>
 
101 + <li><p>any().</p>
 
102 + </li>
 
103 + </ul><p>Для генерации исключений применяется thenThrow().</p>
 
104 + <h2>Финальные классы и статические методы</h2>
 
105 + <p>Современная версия Mockito поддерживает создание моков финальных и статических методов через модуль mockito-inline.</p>
 
106 + <p>Финальный класс:</p>
 
107 + <p>Создание мока:</p>
 
108 + <p>Статическое мокирование подходит для случаев, когда изменение архитектуры невозможно, а тест требует контроля поведения статического вызова.</p>
 
109 + <h2>Особенности использования Mockito</h2>
 
110 + <p>Библиотека предоставляет инструменты для захвата аргументов, сопоставления условий вызова, проверки количества обращений, фиксации параметров и формирования частичных подмен поведения. Корректное применение Mockito предполагает контроль структуры кода: если тест требует множества сложных подмен, это сигнал к рефакторингу тестируемого класса и снижению его ответственности.</p>