我正在获取一个抽象类的模拟,并使用expects
来验证特定方法是否使用某些特定值调用两次。即使生产代码正确,此断言也会失败。这是我使用getMockForAbstractClass
方法创建模拟的时候。现在,当我创建这个抽象类的具体衍生物并将其提供给getMock
时,它确实有效。然而,这种方法并不好,所以我想知道我是否可以避免它。
首次尝试,使用不起作用的getMockForAbstractClass
:http://pastebin.com/09n92Q6h
使用具体衍生物进行的第二次尝试:http://pastebin.com/SxxgN5Cw
答案 0 :(得分:0)
在ocramius
的帮助下,我发现抽象类的具体方法默认情况下不会被模拟掉。需要在getMockForAbstractClass
中指定需要模拟的具体方法。
private function getMockedAbstractClass($className, array $methods)
{
return $this->getMockForAbstractClass(
$className,
array(),
'',
true,
true,
true,
$methods
);
}
使用模拟构建器界面可以更好:
$platform = $this->getMockBuilder($className)
->setMethods($methods)
->getMockForAbstractClass();
完整的解决方案可以在这里看到:https://github.com/doctrine/dbal/pull/586/files