Что делать, когда рекомендации Java конфликтуют с Mockito

StackOverflow https://stackoverflow.com/questions/2052533

  •  20-09-2019
  •  | 
  •  

Вопрос

Моя команда разработчиков начала использовать Мокито и иметь классы, которые были определены как "окончательные".Я читал в "Эффективной Java" Джошуа Блоха и в теме SO Когда использовать final что все классы должны использовать окончательный модификатор.В теме были некоторые разногласия, но я согласен с идеей принудительного составления классов, если только наследование не имеет смысла.

Что мне следует делать, когда я хочу протестировать классы, используя среду тестирования, такую как Mockito, которая требует, чтобы классы не имели модификатора 'final'? Я надеюсь, что кто-то еще сталкивался с подобными проблемами во время их разработки.К каким решениям пришла ваша команда разработчиков?

Есть два очевидных ответа, таких как использование JMock или удаление модификатора 'final' в классах, которые мы хотим протестировать, но мы хотим придерживаться одной внешней платформы тестирования (помимо JUnit), и может быть трудно убедить других разработчиков удалить модификатор 'final'.

Спасибо.

Это было полезно?

Решение

Что вам нужно больше всего:

  1. Возможность убедиться, что кто-то не наследует ваш класс, ИЛИ
  2. Возможность убедиться, что ваш код можно протестировать с использованием выбранной вами среды макетирования?

Как правило, я считаю, что вам не нужно применять (1).Для меня тестируемость (2) гораздо важнее.Что лучше всего подходит для вашей ситуации?

Другие советы

Если вы хотите, чтобы ваши классы были окончательными, вы можете заставить их реализовывать интерфейсы.Интерфейсы мокабельны.

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

Это одно из преимуществ использования макетных объектов;в подобных сценариях они заставляют вас задуматься о том, как лучше организовать код.Если в вашей базе кода много ссылок на конечные классы (таким образом, привязка к конкретной реализации), это нарушает принцип OO "программирование для интерфейса", и необходимость лучшей тестируемости помогла бы вам подумать о рефакторинге, чтобы устранить зависимость от конкретных реализаций.

Эта статья посвящена использованию макетных объектов Эндо-тестирование:Модульное тестирование с макетными объектами содержит раздел (4.4), озаглавленный Обнаружение интерфейса это объясняет, как макетные объекты помогают в обнаружении интерфейсов.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top