PHPunit замокать класс внутри тестируемого класса?

В PHPunit есть возможность замокать класс внутри тестируемого класса с помощью механизма подмены объектов, предоставляемых библиотекой PHPUnit. Это позволяет создать фиктивный (замоканный) объект, который имитирует поведение оригинального класса, но может быть контролируем и настраиваем для целей тестирования.

Для замещения класса внутри тестируемого класса, вы можете использовать следующий подход:

1. Создайте фиктивный объект класса, который должен быть заменен. Это можно сделать с помощью функции createMock() из библиотеки PHPUnit. Например:

$mock = $this->createMock(OriginalClass::class);

2. Установите ожидаемые вызовы методов на фиктивном объекте, используя методы expects() и method():

$mock->expects($this->once())
    ->method('methodName')
    ->willReturn('expectedResult');

В приведенном примере, метод methodName ожидается быть вызванным один раз и возвращает expectedResult.

3. Замените экземпляр оригинального класса в тестируемом классе фиктивным объектом. Это можно сделать путем использования любого из доступных вариантов внедрения зависимостей, таких как конструктор, сеттеры или свойства:

$testedObject = new TestedClass($mock);

В приведенном примере, экземпляр тестируемого класса TestedClass создается с замоканным объектом OriginalClass.

4. Вызовите методы тестируемого класса, которые вызывают методы замененного класса, и проверьте, что он взаимодействует с фиктивным объектом так, как ожидается:

$this->assertEquals('expectedResult', $testedObject->someMethod());

В данном примере мы проверяем, что результат вызова метода someMethod на тестируемом классе TestedClass равен ожидаемому expectedResult на основе настроек замененного класса.

Используя этот подход вы сможете замокать класс внутри тестируемого класса и контролировать его поведение, что позволит вам написать полные и надежные тесты.