Итак, у вас есть базовый класс и расширенный класс. Посмотрите, сможете ли вы реорганизовать расширенный класс, чтобы больше не расширять базовый класс, а использовать его вместо этого. Итак, где вы впервые позвонили parent::fooBar()
, теперь вы звоните this.baseInstance.fooBar()
. Таким образом, вы можете внедрить другой baseInstance для тестирования.
Если вам действительно нужно расширить базовый класс для переопределения чего-либо, извлеките функциональность в третий класс и сделайте расширенный класс прокси. Расширенный класс не делает ничего, кроме вызова методов третьего класса. Э.Г.
protected fooBar() {
return this.realImplementation.fooBar();
}
Таким образом, вы можете протестировать реальную реализацию без создания экземпляра базового класса.