Добавление большего количества зависимостей к классу звучит как слишком большая работа - PullRequest
5 голосов
/ 01 марта 2011

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

Предположим, у нас есть класс A, в котором есть одна зависимость (интерфейс IB), внедренная через конструктор.Допустим, я написал десятки тестовых случаев, написанных для класса A, теперь на более позднем этапе я обнаружил, что мне нужна еще одна зависимость для класса A (скажем, Interface IC).Означает ли это, что я должен изменить свой конструктор и все тесты вместе с ним?Так как я буду создавать объекты для класса A.

Ответы [ 3 ]

8 голосов
/ 01 марта 2011

Это не проблема с DI ; это проблема с тестами . В частности, вы страдаете от хрупкого теста запаха.

Эту проблему можно решить с помощью SUT Factory вместо создания SUT напрямую с помощью ключевого слова new. Это позволит вам изменить сигнатуру конструктора в будущем, не нарушая множество тестов.

5 голосов
/ 01 марта 2011

Это хороший вопрос.Я думаю, что есть две его части - реальная необходимость изменить сигнатуру конструктора и акт введения новой зависимости.

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

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

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

1 голос
/ 03 марта 2011

Да, вы изменяете свой конструктор и свои тесты.Если бы вы обнаружили, что мир круглый, вы бы не стали проверять его на плоскостность, не так ли?:-) С правильными заглушками дополнительная работа не будет такой сложной.Я делаю это все время.Это самое ядро ​​TDD.

С уважением, Мортен

...