Вызов защищенных и приватных методов

Вызов защищенных и приватных методов

Если вам понадобился данный трюк, то, скорее всего, вы имеете проблему в архитектуре класса/приложения. Его использование — данное крайняя мера.

Лучше всего тестировать приватные свойства и способы через публичные способы. Использование данного трюка оправдано в случае экономии времени и при полном понимании зачем вы данное делаете.

Пример тестируемого класса:

class Duck {private function idea( string $target) {return 'I want to do '. $target;}}

Чтобы прочитать свойство $private_property на иное, нам поможет ReflectionMethod. Создаем способ run_inaccesible_method:

private function run_inaccesible_method( $object, string $method_name, array $args = []) {$method = new ReflectionMethod( $object, $method_name);$method->setAccessible( true);$result = $method->invokeArgs( $object, $args);$method->setAccessible( false);return $result;}

Разберем работу способа построчно:

  • При помощи ReflectionMethod получаем в виде объекта способ idea объекта класса Duck;
  • Делаем способ доступным для вызова;
  • Вызываем способ run_inaccesible_method объекта класса Duck при помощи способа invokeArgs;
  • Делаем способ недоступным для вызова;
  • И возвращаем результат.

Пример теста в полном объеме:

use PHPUnit\Framework\TestCase;class Test_Duck extends TestCase {private function run_inaccesible_method( $object, string $method_name, array $args = []) {$method = new ReflectionMethod( $object, $method_name);$method->setAccessible( true);$result = $method->invokeArgs( $object, $args);$method->setAccessible( false);return $result;}public function test_private_method() {$duck = new Duck();$this->assertSame('I want to do quack-quack',$this->run_inaccesible_method( $duck, 'idea', [ 'quack-quack' ]));}}

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *