inf3rno inf3rno - 1 year ago 870
PHP Question

phpunit - mockbuilder - set mock object internal property

Is it possible to create a mock object with disabled constructor and manually setted protected properties?

Here is an idiotic example:

class A {
protected $p;
public function __construct(){
$this->p = 1;

public function blah(){
if ($this->p == 2)
throw Exception();

class ATest extend bla_TestCase {
@expectedException Exception
public function testBlahShouldThrowExceptionBy2PValue(){
$mockA = $this->getMockBuilder('A')
$mockA->p=2; //this won't work because p is protected, how to inject the p value?

So I wanna inject the p value which is protected, so I can't. Should I define setter or IoC, or I can do this with phpunit?

Answer Source

You can make the property public by using Reflection, and then set the desired value:

$a = new A;
$reflection = new ReflectionClass($a);
$reflection_property = $reflection->getProperty('p');

$reflection_property->setValue($a, 2);

Anyway in your example you don't need to set p value for the Exception to be raised. You are using a mock for being able to take control over the object behaviour, without taking into account it's internals.

So, instead of setting p = 2 so an Exception is raised, you configure the mock to raise an Exception when the blah method is called:

$mockA = $this->getMockBuilder('A')
         ->will($this->throwException(new Exception));

Last, it's strange that you're mocking the A class in the ATest. You usually mock the dependencies needed by the object you're testing.

Hope this helps.