У вас есть два класса:
class A {
public function __construct(private B $b) {}
public function doSomething(): string {
return $this->b->getValue();
}
}
class B {
public function getValue(): string {
return 'real';
}
}❓ Нужно написать юнит-тест для A::doSomething(), не трогая класс B. Как это сделать правильно?
Создаём мок через PHPUnit, он реализует интерфейс (или наследует класс) и позволяет изолировать зависимость:
$mockB = $this->createMock(B::class);
$mockB->method('getValue')->willReturn('mocked');
$a = new A($mockB);
$this->assertSame('mocked', $a->doSomething());
Почему работает: createMock() генерирует анонимный класс, расширяющий B. PHP позволяет передать его туда, где ожидается B.