单元测试Doctrine:不能模拟存储库方法

时间:2018-01-16 09:08:31

标签: php testing doctrine-orm doctrine phpunit

我试图模拟一个Doctrine存储库和entityManager,但PHPUnit一直告诉我:

  

1)CommonUserTest :: testGetUserById尝试配置方法" findBy"   由于它不存在而无法配置,但尚未配置   指定的,是最终的,或者是静态的

以下是片段:

<?php
use \Domain\User as User;
use PHPUnit\Framework\TestCase;
use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\EntityManager;

class CommonUserTest extends PHPUnit_Framework_TestCase
{    
    public function testGetUserById()
    {
        // mock the repository so it returns the mock of the user (just a random string)
        $repositoryMock = $this
            ->getMockBuilder(EntityRepository::class)
            ->disableOriginalConstructor()
            ->getMock();

        $repositoryMock->expects($this->any())
            ->method('findBy')
            ->willReturn('asdasd');

        // mock the EntityManager to return the mock of the repository
        $entityManager = $this
            ->getMockBuilder(EntityManager::class)
            ->disableOriginalConstructor()
            ->getMock();

        $entityManager->expects($this->any())
            ->method('getRepository')
            ->willReturn($repositoryMock);

        // test the user method
        $userRequest = new User($entityManager);
        $this->assertEquals('asdasd', $userRequest->getUserById(1));
    }
}

有任何帮助吗?我尝试了一些此代码的变体,但无法通过此特定错误。

感谢。

1 个答案:

答案 0 :(得分:4)

您使用的是哪个版本的PHPUnit?

无论如何,请检查这个可能的解决方案:

$repositoryMock = $this
            ->getMockBuilder(EntityRepository::class)
            ->setMethods(['findBy'])
            ->disableOriginalConstructor()
            ->getMock();

应该工作。