Что делать, если Java Best Practices конфликтует с Mockito - PullRequest
11 голосов
/ 13 января 2010

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

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

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

Спасибо.

Ответы [ 3 ]

10 голосов
/ 13 января 2010

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

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

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

4 голосов
/ 13 января 2010

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

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

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

4 голосов
/ 13 января 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...