有人知道如何嘲笑条令持久集合吗?
当我尝试直接使用PHPUnit和Mockery来模拟类时,我会得到一个异常:
MockeryException: The class DoctrineORMPersistentCollection is marked final a
并且它的方法是不可替代的。标记为final的类可以传递到\Mockery::mock()作为实例化对象来创建部分mock,但前提是ock不接受类型提示检查。
我的研究表明,一旦方法被标记为final,Mockery和/或phpUnit就不能使用反射。
然后,我尝试创建一个stdClass,并为其提供迭代器将使用的方法(valid/current/next),但foreach循环不会调用这些方法,除非该类实现迭代器。
因此,以下代码不起作用。。。
$this -> collectionMock = Mockery::mock('PersistentCollection, Traversable');
$this -> collectionMock -> shouldReceive('rewind');
$this -> collectionMock -> shouldReceive('valid') -> andReturn('true');
$this -> collectionMock -> shouldReceive('next');
$this -> collectionMock -> shouldReceive('current') ->andReturn();
而throws似乎抛出了以下致命错误:
Fatal error: Cannot redeclare Mockery_1670979900_PersistentCollection_Traversable::rewind()
in C:zendProjectzf2vendormockerymockerylibraryMockeryGenerator.php(129) :
eval()'d code on line 43
有人想出一个好办法来嘲笑这个级别的吗
我似乎不可能模拟一个被声明为final的类。然而,也许还有一些希望。由于PersistentCollection
同时实现了DoctrineCommonCollectionsCollection
和DoctrineCommonCollectionsSelectable
,因此可以使用Mockery来模拟实现这两个接口的对象。
Mockery::mock(
'DoctrineCommonCollectionsCollection, DoctrineCommonCollectionsSelectable'
);
我在自己的一个项目中使用过这种方法,效果很好。
至于为什么你不能模拟最后一堂课,这是我能找到的最好的:
仿制品
使用Mockery模拟最终类的能力有限:
同样,主要目的是确保mock对象继承用于类型提示的特定类型。有一个例外,即标记为final的类或标记为finally的方法不能被完全嘲笑。在这些情况下,必须使用部分模拟(稍后解释)。
$mock = Mockery::mock('alias:MyNamespaceMyClass');
在链接页面中搜索"最终"。你会找到我能找到的所有文件。
PHPUnit
试图模拟PHPUnit中的最后一个类会在设计中抛出异常。