Должен ли я никогда не использовать статические методы и классы и синглтоны, следуя парадигме тестирования Driven Development

Я читал, что статические методы, статические классы и синглтоны являются злыми, когда вы пытаетесь реализовать модульное тестирование в своем проекте. Следуя парадигме TDD, я должен просто забыть, что они когда-либо существовали и никогда не использовали их снова, или это нормально использовать их иногда?

Ответ 1

Никогда не говорите никогда - статические классы и методы имеют свое место в панели инструментов.

Тем не менее, если класс, который вы пытаетесь изолировать и тестировать (субъект под тестированием или SUT), зависит от статического класса или метода, вы не сможете написать тест, который изолирует SUT от этой статической зависимости - когда ваш тестовый код работает, он все равно будет использовать статический вызов. Иногда это прекрасно, но иногда вы хотите создать изолированный тест, который проверяет ТОЛЬКО логику вашего SUT без каких-либо зависимостей (обычно посредством насмешек или подобных методов).

В общем, я лично использую статические классы и методы относительно экономно.

Из-за характера внедрения Singletons они представляют собой аналогичную проблему для изоляции SUT для модульного тестирования. Кроме того, концепция однопользовательского режима GOF считается плохой практикой определенного процента разработчиков программного обеспечения. Я согласен с этим настроем, но вряд ли существует консенсус по этому вопросу. Быстрый поиск в google, вероятно, даст вам довольно хорошее представление о плюсах и минусах шаблона Singleton GOF.

Ответ 2

  • Должны ли вы забыть, что они когда-либо существовали? Нет.
  • Должны ли вы убедиться, что их включение в ваш код выполняется таким образом, что они прозрачны для функциональности класса? Да.

Чтобы объяснить эту последнюю часть дальше, вместо того, чтобы пытаться получить значение из одноэлементного кода внутри вашего кода, попробуйте инициализировать значение в аргументе конструктора. Если ваш конструктор слишком велик, создайте метод factory для создания, чтобы вы могли протестировать свой класс, не используя синглтон. Если это окажется проблематичным, или ваш синглтон имеет изменяемое состояние (я бы боялся этого, но, эй, это меня), тогда попробуйте его, чтобы ваш синглтон был так же легко включен в ваше тестирование, насколько это возможно.

Вам не нужно создавать весь файл конфигурации, чтобы проверить метод класса, который вычисляет стандартное отклонение блока котировок акций за 4-часовой период. Это слишком много работы. Но если ваш синглтон написан таким образом, что вы можете заполнить его данными, а другой класс должен отвечать за чтение в файле конфигурации и заполнение этих данных, то вы сделали большие шаги вперед.

Что касается статических методов, я бы сказал, что они наиболее легко проверяемые методы, которые вы могли бы написать на основе условия, что вам не нужно беспокоиться о глобальном состоянии. Статические эквиваленты y = f(x), которые кажутся упрощенными, но лежат в основе того факта, что никакие локальные переходы состояний не могут изменить инвариант, который для данного x вы всегда получите тот же y.

Ответ 3

Как и в любой практике разработки программного обеспечения, никогда не существует ни одного окончательного решения любой ситуации. Поэтому вы никогда не должны исключать статические методы, статические классы и синглтоны. Цель TDD - сделать вашу жизнь проще, и вы заметите, что по мере того, как вы будете работать больше с TDD, ваш код будет модульным, что означает, что даже если вы используете статические методы (... и т.д.), Ваш код будет по-прежнему проверяться.

Правило Мне нравится жить: используйте все, что угодно, пока ваш код легко читается, а ваш дизайн элегантен. Как вы достигаете этих 2, зависит от вас. Если вы еще можете доставить элегантный код, вы можете использовать GOTO.

Ответ 4

Я читал, что статические методы... злы, когда вы пытаетесь внедрить модульное тестирование

Я никогда этого не читал. Не могли бы вы предоставить ссылку? И я бы оспаривал это. Я использую и unit test статические методы (функции) все время и без проблем.


Edited

Спасибо за ссылку на Статические методы - это смертность для тестирования: Эта статья - мусор.

Основная проблема со статическими методами - это процедурный код. Я понятия не имею, как unit тестовый код.

Это означает, что автор не знает много о модульном тестировании. Конечно, вы можете unit test процедурный код.

Во время создания я связываю зависимости с mocks/friendlies, которые заменяют реальные зависимости.

Это ключевая ошибка: идея, что модульное тестирование требует макетных объектов. Это не. В любом случае вы можете передать макет объектов в качестве аргументов для статического метода, который вы тестируете: для инъекции зависимостей не требуется конструктор. Для получения дополнительной информации см. принятый ответ на вопрос "Статические методы: когда и когда нет"

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

Правда, но не имеет значения. Если статический метод A вызывает статический метод B, то это деталь реализации метода A. Поэтому у вас нет бизнеса, пытающегося перехватить вызов B. Просто обрабатывайте A как единицу.

Предположим, что ваше приложение не имеет ничего, кроме статических методов

Аргумент соломона. Очевидно, что в контексте современного модульного тестирования мы говорим о программе OO только с некоторыми статическими методами.