Trying to mock "Doctrine\ORM\Query" class generates error. If you want to test it, see example below.


Class "Doctrine\ORM\Query" is declared "final" and cannot be mocked.

RegistrationRepository


use Doctrine\ORM\EntityRepository;

public function findByEmailAddress(string $emailAddress): iterable
{
return $this->entityRepository
->createQueryBuilder('u')
->where('r.emailAddress = :emailAddress')
->setParameter('emailAddress', $emailAddress)
->getQuery()
->getArrayResult();
}

RegistrationRepositoryTest


use AppBundle\Repository\RegistrationRepository;
use Doctrine\ORM\AbstractQuery;
use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\QueryBuilder;
use PHPUnit\Framework\TestCase;
use PHPUnit_Framework_MockObject_MockObject;

/**
* @test
*/
public function find_by_email_address_returns_an_array_of_results()
{
$emailAddress = 'email_address';

/** @var QueryBuilder|PHPUnit_Framework_MockObject_MockObject $queryBuilderMock */
$queryBuilderMock = $this->getMockBuilder(QueryBuilder::class)
->disableOriginalConstructor()
->getMock();

/** @var EntityRepository|PHPUnit_Framework_MockObject_MockObject $entityRepositoryMock */
$entityRepositoryMock = $this->getMockBuilder(EntityRepository::class)
->disableOriginalConstructor()
->getMock();

$entityRepositoryMock
->expects($this->once())
->method('createQueryBuilder')
->with('r')
->willReturn($queryBuilderMock);

$queryBuilderMock
->expects($this->at(0))
->method('where')
->with('r.userEmailAddress = :userEmailAddress')
->willReturn($queryBuilderMock);

$queryBuilderMock
->expects($this->at(1))
->method('setParameter')
->with('userEmailAddress', $emailAddress)
->willReturn($queryBuilderMock);

/** @var AbstractQuery|PHPUnit_Framework_MockObject_MockObject $queryMock */
$queryMock = $this->getMockBuilder(AbstractQuery::class)
->disableOriginalConstructor()
->setMethods(['getArrayResult'])
->getMockForAbstractClass();

$queryBuilderMock
->expects($this->at(2))
->method('getQuery')
->with()
->willReturn($queryMock);

$queryMock
->expects($this->once())
->method('getArrayResult')
->with()
->willReturn([]);

$this->assertSame([], (new RegistrationRepository())->findByEmailAddress($emailAddress));
}