Search code examples
phpunit-testingdoctrine-ormmockingphpunit

PHP Mocking Final Class


I am attempting to mock a php final class but since it is declared final I keep receiving this error:

PHPUnit_Framework_Exception: Class "Doctrine\ORM\Query" is declared "final" and cannot be mocked.

Is there anyway to get around this final behavior just for my unit tests without introducing any new frameworks?


Solution

  • Since you mentioned you don't want to use any other framework, you are only leaving yourself one option: uopz

    uopz is a black magic extension of the runkit-and-scary-stuff genre, intended to help with QA infrastructure.

    uopz_flags is a function that can modify the flags of functions, methods and classes.

    <?php
    final class Test {}
    
    /** ZEND_ACC_CLASS is defined as 0, just looks nicer ... **/
    
    uopz_flags(Test::class, null, ZEND_ACC_CLASS);
    
    $reflector = new ReflectionClass(Test::class);
    
    var_dump($reflector->isFinal());
    ?>
    

    Will yield

    bool(false)