参见英文答案 > Mock private method with PHPUnit 9个
我有一个这样的课:
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()返回结果而不需要调用实际方法.
解决方法:
如果您可以将private更改为protected,则可以使用部分模拟.
$object = $this->getMockBuilder('A')
->setMethods(array('privateMethod'))
->getMock();
$object->expects($this->any())
->method('privateMethod')
->will($this->returnValue($x));
这将仅替换setMethods数组中的方法的实现,并且所有其他方法将执行原始代码.然而,这对私有方法不起作用,因为模拟对象扩展了原始方法;但它不能覆盖私人.