Mock final classes and methods in PHP.
Extend PfUopz\PHPUnitBridge
instead of PHPUnit\Framework\TestCase
class.
Use PfUopz\MockeryBridge
instead of Mockery
class.
- function
PfUopz\unfinal_class($className)
- mark class as not final - function
PfUopz\unfinal_method($className, $methodName)
- mark method as not final - function
PfUopz\unfinal_all($className)
- mark class and all methods as not final
<?php
use PfUopz\PHPUnitBridge;
final class MyFinalClass {
public function sayHello(): string
{
return 'hello';
}
}
final class MyTest extends PHPUnitBridge
{
public function testFinalClass()
{
$mock = $this->getMockBuilder(MyFinalClass::class)->getMock();
$mock
->expects($this->once())
->method('sayHello')
->willReturn('goodbye');
$this->assertSame('goodbye', $mock->sayHello());
}
}
The simplest solution is to not mark classes or methods as final!
Please note that final (...) methods cannot be stubbed or mocked.