Бесплатный вебинар
«как найти любимую работу»
Подарки на 150 000 ₽ за участие
Живой эфир
Записи не будет!
00:00:00:00
дн.ч.мин.сек.

Как разрешить исключение Unnecessary Stubbing в Mockito

Быстрый ответ

Чтобы не столкнуться с исключением UnnecessaryStubbingException, организуйте моки только для методов, которые вы планируете использовать в тесте. Лишние моки могут усложнить читаемость кода.

Java
Скопировать код
// Симулируем только необходимые вызовы
when(mockedObject.action("use")).thenReturn("result");

// Используем мок в тесте — если он был создан, значит, он необходим
assertThat(mockedObject.action("use"), is("result"));

Чтобы повысить качество тестов, регулярно проверяйте их на правильное использование моков, используйте необходимые способы предотвращения исключений и проводите рефакторинг.

Кинга Идем в IT: пошаговый план для смены профессии

Устраним проблему: распространённые ошибки

Чтобы справиться с UnnecessaryStubbingException, важно уделить внимание следующим возможным ошибкам в ваших тестах:

Созданные моки не используются в вызовах методов

Убедитесь в том, что каждый ваш мок находит своё применение в коде и они не остаются без использования.

Подробнее об этом расскажет наш спикер на видео
skypro youtube speaker

Ошибки до вызова мока

Если тест завершается с ошибкой до того, как доходит до мока, это может вызвать исключение. Проверьте каждое утверждение и каждую операцию, которые могут прервать тест выполнения теста.

Неточности в маршруте кода

Проанализируйте, соответствуют ли моки действительному пути выполнения кода, особенно в случае условной ветвистости.

Чистота кода

Регулярно делайте обзор тестов, чтобы исключить устаревшие моки. Это особенно важно в случае проектов, полученных в наследство, чтобы обеспечить актуальность и удобство работы с вашими тестами.

Стратегии: регулирование строгости Mockito

В сложных тестах может возникнуть потребность в создании неиспользуемых заглушек. Вот как можно настроить строгость Mockito, чтобы избежать ненужных исключений:

Стратегии для JUnit 4

Ослабьте строгость Mockito с помощью MockitoJUnitRunner.Silent или настройте MockitoJUnit.rule().strictness(Strictness.LENIENT).

Java
Скопировать код
// Тест без строгого контроля за мокированием
@RunWith(MockitoJUnitRunner.Silent.class)
public class MyTestClass {

    // Код теста

}

Стратегии для JUnit 5

Вы используете JUnit 5? Настройте строгость с помощью аннотации @MockitoSettings.

Java
Скопировать код
// Настройка строгости в JUnit 5
@MockitoSettings(strictness = Strictness.LENIENT)
class MyTestClass {
    
    // Код теста
    
}

Lenient API Mockito

Используйте lenient() API для более гибкого контроля мокирования начиная с версии mockito-core 2.23.0+.

Java
Скопировать код
// lenient() позволяет быть более снисходительным при создании моков
lenient().when(mockedObject.someMethod()).thenReturn(someValue);

Контроль качества: Рефакторинг для улучшения читаемости

Качественный тест – это не только успешное прохождение и сбой, но также удобочитаемый и легко поддерживаемый код:

Разумность использования моков

Каждый мок должен быть оправданным. Определите, для чего вы их создаете и какую цель они служат.

Оптимизация использования

Рефакторинг ваших тестов поможет повысить их эффективность, сделав тестовые сценарии более гибкими и удобными в сопровождении.

Визуализация

Осветим концепцию неоправданного создания заглушки используя наглядные образы:

Markdown
Скопировать код
Представьте ваш тест как конвейер на производстве.

Неоправданное создание заглушки: Вы добавили процесс (⚙️), который в итоге не применяется!

Markdown
Скопировать код
Вы создали лишний слот (🕳️), который остался неиспользованным!

Решение: Добавляйте на конвейер только то, что действительно востребовано.

Markdown
Скопировать код
До: [⚙️⚙️⚙️⚙️⚙️]
После: [⚙️⚙️] // Только два используемых процесса, без излишеств.

Убирайте лишние элементы, чтобы избежать ненужных потерь производительности.

Чек-лист для профилактики

Вот список рекомендаций, которые помогут защитить ваши тесты от исключений UnnecessaryStubbingExceptions:

  • Анализ "Мок-Станций": Каждая заглушка должна быть необходимой для теста.
  • Синхронизация: Обеспечьте соответствие между моками и тестируемыми методами.
  • Обзор теста: Проанализируйте возможные пути выполнения теста.
  • Планомерное обновление: Проводите регулярную актуализацию тестового покрытия.
  • Следите за указаниями Mockito: Mockito может подсказать на реальные возможности улучшения через свои предупреждения.
  • Testing and Compilation: Убедитесь, что код успешно компилируется и все тесты проходят, прежде чем отбросить заглушку как "ни к чему".

Эти принципы помогут поддерживать ваш набор тестов в актуальном и высокоэффективном состоянии.

Полезные материалы

  1. UnnecessaryStubbingException (Mockito 3.0.0 API) — Официальная документация.
  2. FAQ · mockito/mockito Wiki · GitHub — Часто задаваемые вопросы о Mockito.
  3. Обсуждение в сообществе — Решения на Stack Overflow.
  4. Strictness – mockito-core 5.10.0 javadoc — Уровни строгости одиторинга Mockito.
  5. Учебник по Mockito | Baeldung — Серия статей, посвященная работе с Mockito.
  6. Официальное руководство по созданию заглушек Mockito — Документация о создании моков в Mockito.
Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей
Как разрешить исключение Unnecessary Stubbing в Mockito?
1 / 5