我如何在PHPUnit中模仿原则PersistentCollection

我如何在PHPUnit中模仿原则PersistentCollection,php,unit-testing,doctrine-orm,phpunit,Php,Unit Testing,Doctrine Orm,Phpunit,有人知道如何模仿一个持久的集合吗 当我尝试直接使用PHPUnit和mockry模拟该类时,我得到一个异常,其内容如下: Mockery\Exception: The class Doctrine\ORM\PersistentCollection is marked final a 它的方法是不可替代的。标记为final的类可以传递到\Moc kery::mock()作为实例化对象创建部分mock,但仅当 ock不接受类型提示检查 我的研究表明,一旦这些方法被标记为final,mocky和/或p

有人知道如何模仿一个持久的集合吗

当我尝试直接使用PHPUnit和mockry模拟该类时,我得到一个异常,其内容如下:

Mockery\Exception: The class Doctrine\ORM\PersistentCollection is marked final a
它的方法是不可替代的。标记为final的类可以传递到\Moc kery::mock()作为实例化对象创建部分mock,但仅当 ock不接受类型提示检查

我的研究表明,一旦这些方法被标记为final,mocky和/或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:\zendProject\zf2\vendor\mockery\mockery\library\Mockery\Generator.php(129) :
eval()'d code on line 43

有没有人想出一个好办法来模拟这个类

我似乎不可能模拟一个被宣布为最终类的类。然而,可能还有一些希望。由于
PersistentCollection
同时实现了
doctor\Common\Collections\Collection
doctor\Common\Collections\selective
,因此可以使用mockry来模拟实现这两个接口的对象

Mockery::mock(
    'Doctrine\Common\Collections\Collection, Doctrine\Common\Collections\Selectable'
);
我参与了我自己的一个项目

至于你为什么不能模拟期末考试,这是我能找到的最好的答案:

嘲弄

使用mockry模拟最终类的能力是:

同样,主要目的是确保模拟对象继承用于类型暗示的特定类型。有一个例外,即标记为final的类或带有标记为final的方法的类不能完全模拟。在这些情况下,必须使用局部模拟(稍后解释)

$mock = \Mockery::mock('alias:MyNamespace\MyClass');
在链接页面中搜索“final”。你会找到我能找到的所有文档

PHPUnit


试图在PHPUnit中模拟最后一个类。

我用一个可能的解决方案更新了我的答案。我自己也使用过这个解决方案,并取得了很好的效果(尽管它与您的情况不同)。