PHPUnit:如何模拟私有方法?

参见英文答案 > 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数组中的方法的实现,并且所有其他方法将执行原始代码.然而,这对私有方法不起作用,因为模拟对象扩展了原始方法;但它不能覆盖私人.

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...