Как тестировать private и protected методы, может есть какие-то стандартные средства, позволяющие сделать это?
В интернете видел примеры, что подобные методы вызываются через рефлексию, или
них тупо меняют модификатор доступа на public на время теста.
Ответы
Ответ 1
У класса есть интерфейс - это совокупность его открытых методов. Тем самым он подобе
черному ящику - вы что-то даете на вход, внутри ящика(класса) происходят некие таинственны
процессы, а затем он выдает вам результат этих загадочных процессов. Поэтому любом
пользователю класса важно чтобы должным образом работал именно этот интерфейс, и неважно, за счет чего он работает - за счет хитрых колдунств, безупречной логики или чего-то еще. О наличии приватных методов он ничего не знает и знать не должен. Соответственно, тестирование имеет смысл только для публичных методов. Если они работают должным образом, то и класс работает должным образом. А его внутренности - это его личное дело.
Ответ 2
Никак.
private- и protected-методы не принадлежат официальному «фасаду» класса, на них нет специфицированных пред- и постусловий.
Тестируйте публичные методы, на то они и публичные. Подглядывать в грязное бель
имплементации — некрасиво.
Ответ 3
Попробуйте сделать их internal и использовать аттрибут InternalsVisibleTo
Ответ 4
Если в приватных методах достаточно большое количество логики - подумайте о выносе их в отдельный класс, в котором они будут простыми, публичными и тестируемыми.
Пример:
Надо протестировать класс построителя навмеша. Грубо говоря, у него на входе 3D модел
местности, а на выходе 3D модель навмеша. Внутренняя логика же достаточно сложна (десятки тысяч строк кода).
Соответственно для юнит-тестирования, надо разбивать монолит на множество простых/примитивны
классов (геометрические методы, построитель высот, вектора, триангуляторы и прочие) и тестировать их по отдельности юнит-тестами, и вместе - интеграционными.
Ответ 5
Можно создать новую публичную функцию с префиксом "test" и с теми же аргументами
Использование таких функций легко отследить. Их легко найти (и, следовательно, удалить) в нужный момент.
Примечание: В Python для обозначения приватности используется "__". Но там можн
получить доступ даже к приватному методу, прописав этот спецификатор. Возможно, я ошибся в деталях, но суть такая.
Комментариев нет:
Отправить комментарий