是否可以模拟受保护的属性和方法

Ily*_*512 14 php phpunit protected mocking mockery

是否可以使用PHP Mockery模拟受保护的属性?

我得到了一个带有方法的类,我将其称为"a",它在从同一个类的受保护属性中检索的数组上做了一些魔术.

受保护的属性由另一个方法填充b,在同一个类中.

我想a通过模拟受保护的属性来测试方法,所以我不必b首先使用类方法.

这可能吗?如果没有,我应该重构我的代码吗?或者还有其他方法(考虑最佳实践).

Fre*_*lin 18

可以模拟受保护的方法,但正如有些人指出的那样,如果您觉得需要模拟这些方法,则可能需要重构代码.

如果您确实想要模拟受保护的方法,可以根据以下示例执行此操作:

$myMock = Mockery::mock('myClass')->shouldAllowMockingProtectedMethods();
Run Code Online (Sandbox Code Playgroud)

使用这个模拟,然后可以像模拟公共方法一样模拟受保护的方法.

  • 此方法适用于受保护的方法,但不适用于受保护的属性 (2认同)

小智 6

有时你的代码很好,你认为没有理由改变你的代码来促进测试(我认为这是一个很好的理由),我所做的是在我的对象中使用反射,你甚至可以有这样的辅助方法:

class MockingHelpers
{
    public static function mockProperty($object, string $propertyName, $value)
    {
        $reflectionClass = new \ReflectionClass($object);

        $property = $reflectionClass->getProperty($propertyName);
        $property->setAccessible(true);
        $property->setValue($object, $value);
        $property->setAccessible(false);
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,accessible 仅适用于反射上下文,因此不会造成损坏。

这不是完美的解决方案,有时您的代码中可能确实存在问题,但这可以帮助您!