Моя группа разработчиков начала использовать Mockito и иметь классы, которые были определены как 'финал'. Я читал в Эффективном Java Joshua Bloch и в ТАК поток, Когда использовать финал, что все классы должны использовать заключительный модификатор. В потоке было некоторое разногласие, но я действительно соглашаюсь с идеей вызвать композицию классов, если наследование не имеет смысл.
Что я должен сделать, когда я хочу протестировать классы с помощью среды тестирования как Mockito, который требует, чтобы классы не имели 'заключительный' модификатор? Я надеюсь, что кто-то еще встретился с подобными проблемами во время их разработки. В какие разрешения Ваша группа разработчиков прибывала?
Существует два очевидных ответа, такие как использование JMock или удаляют 'заключительный' модификатор на классах, которые мы хотим протестировать, но мы хотим придерживаться одной внешней среды тестирования (помимо JUnit), и может быть трудно убедить других разработчиков удалять 'заключительный' модификатор.
Спасибо.
Что делает вам нужно больше всего:
Обычно я полагаю, что вы не должны осуществлять (1). Для меня, тестируемость (2), намного более важно. Что соответствует вашей ситуации лучше всего?
Как уже упоминалось в другом ответе, вы можете сделать ваши последние классы для реализации Интерфейс (ы) и в ваших тестах высмеивают интерфейс (ы).
Это одно из преимуществ использования макетных объектов; В таких сценариях, они заставляют вас подумать о том, как код может быть лучше организован. Если ваша база кода имеет большую ссылку на конечные классы (при этом привязку к бетонной реализации) она нарушает принцип oO «программирования к интерфейсу», и потребность лучшей реализации поможет вам подумать о рефакторинге для устранения зависимости от конкретных реализаций.
Данная статья на использовании объектов MOCK Эндо-тестирование: тестирование единиц с объектами MOCK имеет разрез (4.4) с названием Discovery , который объясняет, как объекты Mock могут помочь открыть интерфейсы. Отказ
Создайте числа один раз, скопируйте выходные данные в код в виде гигантской последовательности. Распечатайте последовательность.
-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)?
Если вы хотите, чтобы ваши классы были окончательными, вы можете использовать для них интерфейсы. Интерфейсы могут быть издевательскими.