phpunitmock对象';s属性

phpunitmock对象';s属性,php,unit-testing,mocking,phpunit,mockery,Php,Unit Testing,Mocking,Phpunit,Mockery,我正在寻找一种模拟对象并填充其属性的方法。 下面是一个使用另一个对象属性的方法示例: class MyClass { private $_object; public function methodUnderTest($object) { $this->_object = $object; return $this->_object->property } } 要对该方法进行单元测试,我应该使用PHPUnit中的ge

我正在寻找一种模拟对象并填充其属性的方法。 下面是一个使用另一个对象属性的方法示例:

class MyClass {

    private $_object;

    public function methodUnderTest($object) {
        $this->_object = $object;
        return $this->_object->property
    }
}

要对该方法进行单元测试,我应该使用
PHPUnit
中的
getMockBuilder()
方法创建
$object
的模拟。但是我找不到模拟
$object
属性的方法,只有方法。

要向模拟对象添加属性,只需像通常对对象那样设置属性:

$mock = $this->getMockBuilder('MyClass')
             ->disableOriginalConstructor()
             ->getMock();

$mock->property = 'some_value';
$mock->property
现在将返回
'some\u value'

多亏了阿肯


另外,对于我的项目,这对某些类不起作用,当我尝试调用
$mock->property
时,它只返回
NULL

,如果您有可以使用魔术方法的类:

$mock->method('__get')->with('property')->willReturn('value');

你为什么不在不模仿的情况下设置这些属性呢?我确实试过这么做,但不知道为什么直到今天它才起作用。感谢大家的提醒,你可以像平常一样设置模拟对象的属性幸运的是,我不是完全疯了,你提出的简单解决方案适用于我的大多数类,但对于一些类,它不起作用,只返回
NULL
请确保在原始类中没有使用魔法方法。如果您的类使用魔法方法,您实际上必须模拟
\u get()
方法并使其返回所需的输出。这就是我的一些类失败的原因。
disableOriginalConstructor()
需要用括号表示它是一个方法,而不是一个属性。否则你会被解雇error@powtac与其他方法一样,只需模拟
\uu get()
并使其返回所需的值。问题是,这种方法不是真正动态的,如果在您正在测试的方法中多次使用,则很难模拟。我可能错了,但我认为有一种方法可以通过说“当你收到一个返回B,当你收到X返回Y”来模拟一个方法。如果你的类使用神奇的方法,你可以对特定的属性进行模拟,比如:
$mock->method(''uuu get')->with('propname')->willReturn('fakevalue')