Я бы сказал, что вы всегда должны избегать оператора new в классе, когда речь идет о сложных объектах (за исключением случаев, когда класс равен Builder
или Factory
), чтобы уменьшить связь и сделать ваш код лучше тестируемым.Объекты вне курса, такие как List, Dictionary или объекты-значения, могут быть созданы внутри метода класса (что, вероятно, и является целью метода класса!)
Допустим, например, что ваш AdapteeClass равен Remote Proxy
.Если вы хотите использовать модульное тестирование, ваши модульные тесты должны будут использовать реальный прокси-класс, потому что нет никакого способа заменить его в ваших модульных тестах.
Если вы используете первый подход, вы можете легко внедритьподшучивать или подделывать конструктор при запуске модульного теста, чтобы вы могли протестировать все пути кода.
У Google есть руководство по написанию тестируемого кода , которое описывает это более подробно, но некоторые важные моменты::
Предупреждающие знаки для не тестируемого кода
- новое ключевое слово в конструкторе или при объявлении поля
- Статические вызовы метода в конструкторе или при объявлении поля
- Все, что угодно, кроме присваивания полей в конструкторах
- Объект не полностью инициализирован после завершения конструктора (обратите внимание на методы инициализации)
- Поток управления (условная или циклическая логика) вconstructor
- Код выполняет построение графа сложных объектов внутри конструктора, а не использует фабрику или конструктор.
- Добавление или использование блока инициализации