PHPUnit:如何模拟私有方法?

时间:2014-10-17 13:55:27

标签: php unit-testing phpunit

我有一个这样的课程:

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()返回结果而不需要实际调用方法。

1 个答案:

答案 0 :(得分:6)

如果您可以将private更改为protected,则可以使用部分模拟。

$object = $this->getMockBuilder('A')
    ->setMethods(array('privateMethod'))
    ->getMock();
$object->expects($this->any())
    ->method('privateMethod')
    ->will($this->returnValue($x));

这将仅替换setMethods数组中的方法的实现,所有其他方法将执行原始代码。然而,这对私有方法不起作用,因为模拟对象扩展了原始方法;但它无法覆盖private