Что сделать, когда Лучшие практики Java конфликтуют с Mockito

Моя группа разработчиков начала использовать Mockito и иметь классы, которые были определены как 'финал'. Я читал в Эффективном Java Joshua Bloch и в ТАК поток, Когда использовать финал, что все классы должны использовать заключительный модификатор. В потоке было некоторое разногласие, но я действительно соглашаюсь с идеей вызвать композицию классов, если наследование не имеет смысл.

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

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

Спасибо.

11
задан Community 23 May 2017 в 12:34
поделиться

3 ответа

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

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

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

10
ответ дан 3 December 2019 в 06:46
поделиться

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

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

Данная статья на использовании объектов MOCK Эндо-тестирование: тестирование единиц с объектами MOCK имеет разрез (4.4) с названием Discovery , который объясняет, как объекты Mock могут помочь открыть интерфейсы. Отказ

4
ответ дан 3 December 2019 в 06:46
поделиться

Создайте числа один раз, скопируйте выходные данные в код в виде гигантской последовательности. Распечатайте последовательность.

-121--231668-

Вы говорите:

Для другого можно вернуть списки из функций, даже если вы никогда передан в списке при вызове функция и даже несмотря на то, что функция не содержит конструктор List, Например,

x = strsplit(LETTERS[1:10], "") # passing in an object of type 'character'
class(x)
# => 'list'

И я полагаю, вы предполагаете, что это проблема (?). Я здесь, чтобы сказать вам, почему это не проблема: -). Ваш пример немного прост, так как при разделении строки имеется список с элементами длиной 1 элемента, поэтому известно, что x [[1]] совпадает с unlist (x) [1] . Но что, если результат strsplit вернул результаты различной длины в каждой ячейке. Просто вернуть вектор (против списка) совсем не получится.

Например:

stuff <- c("You, me, and dupree",  "You me, and dupree",
           "He ran away, but not very far, and not very fast")
x <- strsplit(stuff, ",")
xx <- unlist(strsplit(stuff, ","))

В первом случае ( x : который возвращает список) можно указать, какой была 2-я «часть» 3-й строки, например: x [[3]] [2] . Как вы могли бы сделать то же самое с помощью xx теперь, когда результаты были «распутаны» ( unlist -ed)?

-121--54025-

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

4
ответ дан 3 December 2019 в 06:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: