PHP 模拟最终类
2022-08-30 11:51:46
我试图模拟一个php,但由于它被声明,我不断收到这个错误:final class
final
PHPUnit_Framework_Exception: Class "Doctrine\ORM\Query" is declared "final" and cannot be mocked.
是否只是为了我的单元测试而不引入任何新框架来绕过此行为?final
我试图模拟一个php,但由于它被声明,我不断收到这个错误:final class
final
PHPUnit_Framework_Exception: Class "Doctrine\ORM\Query" is declared "final" and cannot be mocked.
是否只是为了我的单元测试而不引入任何新框架来绕过此行为?final
既然你提到你不想使用任何其他框架,你只给自己留了一个选择: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)
对于正在寻找此特定教义查询模拟答案的人的延迟响应。
你不能嘲笑 Doctrine\ORM\Query,因为它的“final”声明,但是如果你查看Query类代码,那么你会看到它的扩展 AbstractQuery 类,并且不应该有任何问题嘲笑它。
/** @var \PHPUnit_Framework_MockObject_MockObject|AbstractQuery $queryMock */
$queryMock = $this
->getMockBuilder('Doctrine\ORM\AbstractQuery')
->disableOriginalConstructor()
->setMethods(['getResult'])
->getMockForAbstractClass();