PHP 模拟最终类

我试图模拟一个php,但由于它被声明,我不断收到这个错误:final classfinal

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

是否只是为了我的单元测试而不引入任何新框架来绕过此行为?final


答案 1

既然你提到你不想使用任何其他框架,你只给自己留了一个选择:uopz

uopz 是 runkit-and-scary-stuff 类型的黑魔法扩展,旨在帮助 QA 基础设施。

uopz_flags是一个可以修改函数、方法和类标志的函数。

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

将产生

bool(false)

答案 2

对于正在寻找此特定教义查询模拟答案的人的延迟响应。

你不能嘲笑 Doctrine\ORM\Query,因为它的“final”声明,但是如果你查看Query类代码,那么你会看到它的扩展 AbstractQuery 类,并且不应该有任何问题嘲笑它。

/** @var \PHPUnit_Framework_MockObject_MockObject|AbstractQuery $queryMock */
$queryMock = $this
    ->getMockBuilder('Doctrine\ORM\AbstractQuery')
    ->disableOriginalConstructor()
    ->setMethods(['getResult'])
    ->getMockForAbstractClass();

推荐