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>