Как разрешить исключение Unnecessary Stubbing в Mockito
Быстрый ответ
Чтобы не столкнуться с исключением UnnecessaryStubbingException, организуйте моки только для методов, которые вы планируете использовать в тесте. Лишние моки могут усложнить читаемость кода.
// Симулируем только необходимые вызовы
when(mockedObject.action("use")).thenReturn("result");
// Используем мок в тесте — если он был создан, значит, он необходим
assertThat(mockedObject.action("use"), is("result"));
Чтобы повысить качество тестов, регулярно проверяйте их на правильное использование моков, используйте необходимые способы предотвращения исключений и проводите рефакторинг.
Устраним проблему: распространённые ошибки
Чтобы справиться с UnnecessaryStubbingException, важно уделить внимание следующим возможным ошибкам в ваших тестах:
Созданные моки не используются в вызовах методов
Убедитесь в том, что каждый ваш мок находит своё применение в коде и они не остаются без использования.
Ошибки до вызова мока
Если тест завершается с ошибкой до того, как доходит до мока, это может вызвать исключение. Проверьте каждое утверждение и каждую операцию, которые могут прервать тест выполнения теста.
Неточности в маршруте кода
Проанализируйте, соответствуют ли моки действительному пути выполнения кода, особенно в случае условной ветвистости.
Чистота кода
Регулярно делайте обзор тестов, чтобы исключить устаревшие моки. Это особенно важно в случае проектов, полученных в наследство, чтобы обеспечить актуальность и удобство работы с вашими тестами.
Стратегии: регулирование строгости Mockito
В сложных тестах может возникнуть потребность в создании неиспользуемых заглушек. Вот как можно настроить строгость Mockito, чтобы избежать ненужных исключений:
Стратегии для JUnit 4
Ослабьте строгость Mockito с помощью MockitoJUnitRunner.Silent
или настройте MockitoJUnit.rule().strictness(Strictness.LENIENT)
.
// Тест без строгого контроля за мокированием
@RunWith(MockitoJUnitRunner.Silent.class)
public class MyTestClass {
// Код теста
}
Стратегии для JUnit 5
Вы используете JUnit 5? Настройте строгость с помощью аннотации @MockitoSettings
.
// Настройка строгости в JUnit 5
@MockitoSettings(strictness = Strictness.LENIENT)
class MyTestClass {
// Код теста
}
Lenient API Mockito
Используйте lenient()
API для более гибкого контроля мокирования начиная с версии mockito-core 2.23.0+.
// lenient() позволяет быть более снисходительным при создании моков
lenient().when(mockedObject.someMethod()).thenReturn(someValue);
Контроль качества: Рефакторинг для улучшения читаемости
Качественный тест – это не только успешное прохождение и сбой, но также удобочитаемый и легко поддерживаемый код:
Разумность использования моков
Каждый мок должен быть оправданным. Определите, для чего вы их создаете и какую цель они служат.
Оптимизация использования
Рефакторинг ваших тестов поможет повысить их эффективность, сделав тестовые сценарии более гибкими и удобными в сопровождении.
Визуализация
Осветим концепцию неоправданного создания заглушки используя наглядные образы:
Представьте ваш тест как конвейер на производстве.
Неоправданное создание заглушки: Вы добавили процесс (⚙️), который в итоге не применяется!
Вы создали лишний слот (🕳️), который остался неиспользованным!
Решение: Добавляйте на конвейер только то, что действительно востребовано.
До: [⚙️⚙️⚙️⚙️⚙️]
После: [⚙️⚙️] // Только два используемых процесса, без излишеств.
Убирайте лишние элементы, чтобы избежать ненужных потерь производительности.
Чек-лист для профилактики
Вот список рекомендаций, которые помогут защитить ваши тесты от исключений UnnecessaryStubbingExceptions:
- Анализ "Мок-Станций": Каждая заглушка должна быть необходимой для теста.
- Синхронизация: Обеспечьте соответствие между моками и тестируемыми методами.
- Обзор теста: Проанализируйте возможные пути выполнения теста.
- Планомерное обновление: Проводите регулярную актуализацию тестового покрытия.
- Следите за указаниями Mockito: Mockito может подсказать на реальные возможности улучшения через свои предупреждения.
- Testing and Compilation: Убедитесь, что код успешно компилируется и все тесты проходят, прежде чем отбросить заглушку как "ни к чему".
Эти принципы помогут поддерживать ваш набор тестов в актуальном и высокоэффективном состоянии.
Полезные материалы
- UnnecessaryStubbingException (Mockito 3.0.0 API) — Официальная документация.
- FAQ · mockito/mockito Wiki · GitHub — Часто задаваемые вопросы о Mockito.
- Обсуждение в сообществе — Решения на Stack Overflow.
- Strictness – mockito-core 5.10.0 javadoc — Уровни строгости одиторинга Mockito.
- Учебник по Mockito | Baeldung — Серия статей, посвященная работе с Mockito.
- Официальное руководство по созданию заглушек Mockito — Документация о создании моков в Mockito.