Как тестировать класс с вложенными зависимыми приватными методами?

Рейтинг: 2Ответов: 0Опубликовано: 05.06.2023

Есть класс с взаимосвязанными методами.

<?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);
    }
}

Ответы

Ответов пока нет.