设置可访问不会使私有属性在使用时可访问它嘲弄

Posted

技术标签:

【中文标题】设置可访问不会使私有属性在使用时可访问它嘲弄【英文标题】:set accessible does not make the private propery accessible when used it mockery 【发布时间】:2017-05-09 01:16:58 【问题描述】:

我想模拟一个类来测试它。它有一个由网络请求设置的private property detail。我试图通过模拟json file 在测试其他methods 之前设置property。一切正常,除了,当它是私有属性时我似乎无法设置该属性,但当它是受保护的属性时可以工作。

$mockedClass = \Mockery::mock( Myclass::class )->makePartial();
$reflection = new \ReflectionClass($mockedClass);
$property = $reflection->getProperty( 'detail' );
$property->setAccessible(true);
$property->setValue($mockedClass, $jsonData ); 

所以当 detailprivate property 时,它 Mockery 会抛出 Property detail does not exist,但是当我将 detail 设置为受保护时,它可以工作。

我不想让detail 成为protected property,因为它不需要,但我需要这样做来测试它。

当我在某处读到“就像你妈妈说的那样,不要暴露你的私处”。我不想暴露我的隐私。

【问题讨论】:

你在“'detail”之后错过了单个配额 @RaghavRangani 我的错,修复它。 还是你的问题?? @RaghavRangani 这是我的问题,我不会收到我提到的其他错误,我只会收到缺少引号的错误。 【参考方案1】:

尝试做这个微小的改变:

$mockedClass = \Mockery::mock( Myclass::class )->makePartial();
$reflection = new \ReflectionClass(Myclass::class); // Pass the class name, not the actual mock object
$property = $reflection->getProperty( 'detail' );
$property->setAccessible(true);
$property->setValue($mockedClass, $jsonData ); 

【讨论】:

不知道为什么我没有尝试这个但工作起来就像一个魅力。谢谢

以上是关于设置可访问不会使私有属性在使用时可访问它嘲弄的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Python 中使私有变量可访问? [复制]

面向对象之成员修饰符

C#属性访问器

如何在我的 android 应用程序中的任何位置使实例可用或可访问

为啥我应该在属性访问器中使用私有变量?

92.私有属性和私有方法