Методы конкретного экземпляра так же плохи, как статические методы тестирования, верно?
Если метод A()
вызывает статический метод B()
, это плохо, потому что они тесно связаны, верно?
Но если вместо звонка B()
, A()
называется нестатическим методом C()
некоторого конкретного класса, это было бы одинаково плохо для тестирования, правильно? Потому что сейчас A()
связан с конкретным классом, который владеет C()
,
Единственный хороший сценарий случается, когда используются интерфейсы (то есть внедрение зависимости), и A()
вызывает метод интерфейса.
Я правильно понял? Существуют ли другие причины, по которым статические методы не подходят для тестирования?
2 ответа
Первый сценарий "плохой", потому что трудно B()
называется
Второй сценарий, возможно, не совсем "плохой", потому что, в зависимости от того, как вы получите свой экземпляр класса, которому принадлежит C()
Вы можете заменить этот объект на другой (скажем, подкласс).
Третий сценарий, как правило, "лучший", поскольку он позволяет легче изменить реализацию A()
, но это верно только в том случае, если нет жестко запрограммированной конструкции конкретного класса, обеспечивающей A()
(т. е. только true, если внедрение зависимостей действительно используется).
Это зависит от языка. Например, в языке, подобном Java, вызов метода экземпляра в конкретном классе вовсе не вреден для тестирования, поскольку можно создать экземпляр прокси-сервера для этого конкретного класса, что позволяет эффективно перехватывать вызовы (и, как правило, отключать их)., Фактически, многие фреймворки используют это средство прокси для внедрения своего собственного кода до / после пользовательского кода, чтобы обеспечить такие функции, как внедрение зависимостей и поддержка AOP.