Search code examples
unit-testingmockingphpunitstub

WHY does it need an argument the mock abstract class constructor


I am trying mock the AbstractQuery class of doctrine

    $this->abstractQuery = $this->getMockForAbstractClass('Doctrine\ORM\AbstractQuery')
                                ->disableOriginalConstructor();

Now I will do my stub

    $this->abstractQuery->expects($this->at(1))
                        ->method('getResult')
                        ->willReturn('our query result');

I getting this error

Argument 1 passed to Doctrine\ORM\AbstractQuery::__construct() must be an instance of Doctrine\ORM\EntityManagerInterface, none given

disabledOriginalConstructor phpunit's method by default is false

/...
public function disableOriginalConstructor()
{
    $this->originalConstructor = false;

    return $this;
}
/...

and getMockForAbstractClass method it took that value

public function getMockForAbstractClass()
{
    $object = $this->generator->getMockForAbstractClass(
        $this->type,
        $this->constructorArgs,
        $this->mockClassName,
        $this->originalConstructor,
        $this->originalClone,
        $this->autoload,
        $this->methods,
        $this->cloneArguments
    );

    $this->testCase->registerMockObject($object);

    return $object;
}

any idea ?


Solution

  • disableOriginalConstructor() is the API of MockBuilder class and NOT of class that you get with $this->getMockForAbstractClass('Doctrine\ORM\AbstractQuery')

    There are 2 options.

    1) First:

    Still using method getMockForAbstractClass

    $this->abstractQuery = $this->getMockForAbstractClass(
        'Doctrine\ORM\AbstractQuery', 
        [], // default value
        '', // default value
        false, // this is $callOriginalConstructor argument
        true, // default value
        true, // default value
        ['getResult'] // here we define methods that we want to mock
    );
    

    2) Second:

    Using MockBuilder

    $this->abstractQuery = $this
        ->getMockBuilder('Doctrine\ORM\AbstractQuery')
        ->setMethods(['getResult'])
        ->disableOriginalConstructor()
        ->getMockForAbstractClass();
    

    I personally prefer MockBuilder because it is more readable.