我有一个这样的课程:
class A {
private function testing($x)
{
// do something
$this->privateMethod();
}
private function privateMethod($number) {
// do something
}
}
要调用testing(),我使用:
$reflection = new \ReflectionClass('A');
$method = $reflection->getMethod('testing');
$method->setAccessible(TRUE);
$object = new A();
$parameters = array();
$result = $method->invokeArgs($object, $parameters);
但我不知道如何模仿privateMethod()。我只想测试testing()方法中的代码。我想指出我想要privateMethod()返回结果而不需要实际调用方法。
答案 0 :(得分:6)
如果您可以将private更改为protected,则可以使用部分模拟。
$object = $this->getMockBuilder('A')
->setMethods(array('privateMethod'))
->getMock();
$object->expects($this->any())
->method('privateMethod')
->will($this->returnValue($x));
这将仅替换setMethods
数组中的方法的实现,所有其他方法将执行原始代码。然而,这对私有方法不起作用,因为模拟对象扩展了原始方法;但它无法覆盖private
。