Как тестировать класс с вложенными зависимыми приватными методами?
Есть класс с взаимосвязанными методами.
<?php
class SomeClass {
public $a = 0;
public function __construct() {
$this->a = $this->f1();
}
private function f1() {
$f2 = $this->f2();
if ($f2 !== 6) {
return 10;
}
return $f2 + 1;
}
private function f2() {
return 6;
}
}
Мы видим, что результат того, что будет в $a
зависит аж от метода f2
.
Вопрос: как можно в текущем случае для метода f2
задать другое возвращаемое значение? Я мог бы замокать, но для этого метод должен быть как минимум protected
, но в коде не задумано наследование этого класса и поэтому установка другого модификатора доступа исключена.
Код ниже работает нормально с protected методом (но нужно с private или какой-то другой подход)
class SomeClassTest extends Unit {
use Specify;
public function test_mock() {
$mock = $this->getMockBuilder(SomeClass::class)
->disableOriginalConstructor()
->setMethods(['f2'])
->getMock();
$mock->method('f2')->willReturnCallback(function () { return 10; });
$reflectedClass = new ReflectionClass(SomeClass::class);
$constructor = $reflectedClass->getConstructor();
$constructor->invoke($mock);
$this->assertEquals(10, $mock->a);
}
}
Источник: Stack Overflow на русском